View篇之深入探討布局屬性


概念


View的幾何性質是通過它的frame、bounds和center屬性定義的。frame定義了視圖在父視圖坐標系統中的源點位置和尺寸大小,通常用于在布局中調整視圖的位置和大小。bounds定義了可視視圖的內部尺寸大小。center通常用來在不改變視圖的大小的前提下調整視圖的位置。

關系


1.frame和bounds的size部分兩者是緊密聯系在一起的,所以改變改變其中任一一個,都會更新兩者的size。值得注意的是frame的size并不總是等于bounds的size的。

2.實際上frame時一個派生屬性。當使用frame來布局時,需要特別注意的是:如果視圖的transform不等于CGAffineTransformIdentity時,frame可能并不能正確反映出視圖的位置,此時請用bounds和center代替。

猜想


1.在UIKit框架下,View不過是對Layer進行了封裝,并接管了處理事件的能力。顯示在屏幕上的依舊是Layer。

2.View的本身視圖和本身圖層共用一套坐標系(其實只有一個Layer坐標系,也不是共用了啦,亦可理解成共用),

3.視圖中的frame,bounds,center只不過是圖層中的frame,bounds,position

4.由于視圖沒有暴露出圖層的anchorPoint,因而在不改變anchorPoint默認位置的前提下,center是frame的中點的才成立。

5.這也解釋了為什么對View某些的操作和直接操作Layer的效果是一樣的。


坐標系簡析


子視圖(圖層)所在的坐標系,是由父視圖(圖層)的bounds所決定的。

center簡析


1.視圖的center與圖層的position是同一坐標系下的同一個點。當操作視圖的center時,實際上是改變位于視圖下方CALayer的position,不能獨立于圖層之外改變視圖的center。

2.anchorPoint和position的關系是不同坐標系下的同一個點。(關于anchorPoint和position的關系,我將于Layer篇再進行解讀吧)

3.圖層的anchorPoint默認位于圖層的中點,此時圖層的position位于圖層的中點,因而視圖的center是frame的中心點。

4.但是當anchorPoint不位于圖層的中點時,此時圖層的position不位于圖層的中點,因而視圖的center不是frame的中心點。

frame簡析


1.視圖的frame與圖層的frame是同一坐標系統下的同一區域。當操作視圖的frame時,實際上是改變位于視圖下方CALayer的frame,不能獨立于圖層之外改變視圖的frame

2.關于圖層的frame,我將于Layer篇再進行解讀吧

bounds簡析


1.視圖的bounds與圖層的bounds是同一坐標系統下的同一區域。當操作視圖的bounds時,實際上是改變位于視圖下方CALayer的bounds,不能獨立于圖層之外改變視圖的bounds

2.通過改變bounds.origin,可以改變其所決定的坐標系,所有依賴于此坐標系的子視圖,其位置都會產生相應的移動,以適應舊坐標系到新坐標系過渡的需要。這也就是scroll實現的原理。

3.更深更具體,關于圖層的bounds,我將于Layer篇再進行解讀吧


未完待續(個人見解)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容