天天看點

iOS程式設計(雙語版)-視圖-Frame/Bounds/Center

1. Frame

每個視圖都有一個frame屬性,它是CGRect結構,它描述了視圖所在的矩形在其父視圖中的位置。

(螢幕坐标系預設的原點在左上角,x軸向右伸展,y軸向下伸展)

設定frame通常通過視圖的指定初始化器initWithFrame

下面來看個例子,該例子初始化了3個互相疊加的矩形區域

(Objective-C代碼)

(Swift代碼 iOS9)

運作結果:

iOS程式設計(雙語版)-視圖-Frame/Bounds/Center

2. Bounds

Bounds也是CGRect結構,和Frame不同,它描述的是視圖自身的矩形區域,是相對于自身的坐标系而言的。

下面的例子建立了2個疊加的矩形視圖,子視圖為綠色較小的那個

 運作結果:

iOS程式設計(雙語版)-視圖-Frame/Bounds/Center

下面的例子通過改變綠色子視圖的bounds将父視圖完全覆寫

iOS程式設計(雙語版)-視圖-Frame/Bounds/Center

下面的例子,紫色父視圖的原點進行少量偏移

運作結果:

iOS程式設計(雙語版)-視圖-Frame/Bounds/Center

3. Center

Center即視圖的中心點位置坐标

4. 關于主視窗和裝置螢幕

裝置螢幕(UIScreen.mainScreen())沒有frame, 但它有bounds。

主視窗沒有父視圖,但是它的frame可以設為螢幕的bounds。

5. 關于frame和bounds的差別

一言以蔽之,就是前者相對于父視圖,而後者相對于自身。

我們還是用圖檔來看一下吧,這樣更直覺

在視圖未旋轉的情況下,它們差不多,坐标稍有差別,如下圖:

iOS程式設計(雙語版)-視圖-Frame/Bounds/Center

而在視圖作了類似旋轉的transform之後,它們的坐标則有很大的差别了,見下圖:

iOS程式設計(雙語版)-視圖-Frame/Bounds/Center