View and Window Architecture
View Hierarchies and Subview Management
- 父視圖維護(hù)著一個(gè)子視圖數(shù)組,數(shù)組最后一個(gè)元素就是父視圖內(nèi)頂部的視圖
The View Drawing Cycle
- 不改變視圖內(nèi)容不會(huì)調(diào)用重繪代碼
- 改變視圖內(nèi)容不會(huì)馬上進(jìn)行重繪,需要調(diào)用
setNeddsDisplay或者setNeddsDisplayInRect,這兩個(gè)方法會(huì)告訴系統(tǒng)需要重繪,系統(tǒng)會(huì)在當(dāng)前 runloop 結(jié)束以后開始重繪,這段時(shí)間還可以進(jìn)行更改 - 改變視圖的形狀也不會(huì)調(diào)用重繪代碼,只有當(dāng)設(shè)置
contentMode屬性為UIViewContentModeRedraw時(shí)才會(huì)調(diào)用
View Geometry and Coordinate Systems
- iOS坐標(biāo)系原點(diǎn)是左上角,向右是 X 軸,向下是 Y 軸,UIWindows 和 UIView 有方法可以將一個(gè)坐標(biāo)系轉(zhuǎn)換到另一個(gè)坐標(biāo)系
The Relationship of the Frame, Bounds, and Center Properties
- frame 指的是在父視圖坐標(biāo)系中指定了位置和大小,設(shè)置該值影響 bounds 和 center
- bounds 指的是在自己的坐標(biāo)系中指定了大小,設(shè)置該值影響 frame
- center 指的是在父視圖坐標(biāo)系中指定一個(gè)點(diǎn)作為自己的中心點(diǎn),設(shè)置該值影響frame
- 子視圖超出父視圖的區(qū)域可以使用
clipsTobounds消除
Tips for Using Views Effectively
- 盡量減少繪制
- 不設(shè)置
contentMode屬性為UIViewContentModeRedraw - 設(shè)置視圖為不透明
- 滾動(dòng)會(huì)在短時(shí)間內(nèi)產(chǎn)生大量的視圖更新,建議在滾動(dòng)時(shí)可以改變 contentMode 屬性或者暫時(shí)改變呈現(xiàn)內(nèi)容的質(zhì)量
- 不在視圖中嵌入自定義視圖,比如按鈕中嵌入一個(gè)自定義圖片
Views
Tweaking the Layout of Your Views Manually
- 當(dāng) view 的 size 改變時(shí),會(huì)調(diào)用
layoutSubviews方法 - 在滾動(dòng)時(shí)會(huì)頻繁 layoutsubview,當(dāng)滾動(dòng)事件開始,跟視圖調(diào)用
setNeedsLayout,layoutSubviews方法會(huì)根據(jù)偏移量來更改視圖位置 - 在寫布局代碼時(shí),注意以下兩點(diǎn)
- 改變?cè)O(shè)備方向時(shí)
- 狀態(tài)欄高度改變,例如打電話時(shí)狀態(tài)欄高度會(huì)增加
Interacting with Core Animation Layers
- 每個(gè) view 的 layerClass 默認(rèn)是 CALayer,可以通過重寫
layerClass方法來返回其他的 layer,例如你使用了大范圍的滾動(dòng)區(qū)域,你可以使用CATiledLayer類 - view 的 delegate 指向他自身的 layer
- layer 不接收事件也不參與響應(yīng)鏈