IOS介面開發基礎——Frame與Bounds

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.