標籤:object-c 介面 frame bounds ui
參考資料:http://blog.csdn.net/hherima/article/details/39501857
在IOS的UI開發中,經常需要對view進行定位。比較常用的概念就是Frame和Bound,通過view這兩個屬性,就可以任意的“擺弄”我們的view了。
這兩個屬性都可以定義view的位置和大小,但這兩個屬性之間有什麼區別和聯絡呢?經過資料尋找,記錄如下:
Frame與Bounds的基本概念
首先,Frame與Bounds都是一個CGRect結構:
struct CGRect { CGPoint origin; CGSize size;};
origin可以設定view的位置(x,y), size可以設定view的大小(width, height)。
那麼,Frame和Bounds的區別可以分別在origin和size上討論。
Frame與Bounds的origin
1、其座標系系統不同。
- Frame的origin座標系是其父視圖,即其x,y座標是在其父視圖語境中的。
- Bounds的origin座標系是在自身語境中的。
這裡引用一片說明
2、Frame與Bounds的origin的作用不同。
- Frame設定origin的作用在於對其在父視圖中進行定位,比如你設定子view的frame的origin為(10,10),那麼當子view被添加到父view中時,子view的位置就在父view座標系的(10,10)處。
- Bounds的origin作用,體現在對設定Bounds的view添加子view的時候,設定bounds的origin,會致使view的原點移位,即會對view的左上方座標進行改變(預設view的左上方座標為view的原點座標(0,0))。當你對某個view(假設叫viewA)設定了bounds的origin後(這裡我們假設設定為了-20,-15),那麼view的左上方座標也就變成了(-20,-15)。當再向viewA添加subView的時候(假設叫viewB),若設定viewB的frame的origin為(0,0),本來應該顯示在viewA的左上方的,但此時viewA的左上方座標為(-20,-15),那麼這時候的(0,0)座標就不在是viewA的左上方,而是如所示的地方。同時,可以對比兩幅圖,viewB的frame.origin均為(0,0),但viewA的bounds.origin不同而引起viewB最終的位置不同。
Frame與Bounds的size相比origin,Frame與Bounds的size區別並沒有那麼大,他們均是作用於view自身,用來設定view的size大小,即width與height。當view的frame和bounds屬性的size設定為一樣大小時,那麼這兩個屬性沒任何區別。但當frame與bounds的size不一樣時,問題就來了:在後面設定的那個size會替換之前設定的size。即你可能期初設定bounds.size = (100,200),之後又設定frame.size=(30,10),那麼view的實際size以後設定的那個size為準,即size為(30,10)。除了這個準則外,還有一個要注意的是,若在設定了frame之後,再設定bounds,那麼之前設定的frame.origin會因為本身view大小的改變而改變。具體規則為,frame會在左右(上下)位置均勻的增大(減小)相應的數值。例如如下代碼:
_viewA = [[UIView alloc] init]; CGRect rectA = CGRectMake(10, 60, 100, 100); _viewA.frame = rectA; _viewA.bounds = CGRectMake(0, 0, 200, 20); CGRect temp = _viewA.frame;
這時候,temp的值為
origin=(x=-40, y=100) size=(width=200, height=20)
之所以x=-40, 是因為viewA的width由100變為了200,viewA在左右方向各增大了50(合計100),那麼,在x方向上,其座標就是10-50 = -40.height由100減小為20,viewA在上下方向上各減小40,那麼y方向上,其座標為60+40=100.
總結一下,frame屬性可以協助我們在父視圖中定位子視圖,而bounds屬性則主要用來設定本視圖的原點座標。至於size的大小,個人感覺統一大小即可,若在bounds和frame中設定不同的size,那麼會照成一定的混亂,個人感覺沒什麼意思。
IOS介面開發基礎——Frame與Bounds