重繪佈局等方法使用說明
1.layoutIfNeeded、setNeedsLayout:-setNeedsLayout方法:
標記為需要重新佈局,非同步呼叫layoutIfNeeded
重新整理佈局,不立即重新整理,但layoutSubviews
一定會被呼叫
-layoutIfNeeded方法:
如果,有需要重新整理的標記,立即呼叫layoutSubviews
進行佈局(如果沒有標記,不會呼叫layoutSubviews
)
如果要立即重新整理,要先呼叫[view setNeedsLayout]
,把標記設為需要佈局,然後馬上呼叫[view layoutIfNeeded]
,實現佈局
在檢視第一次顯示之前,標記總是“需要重新整理”的,可以直接呼叫[view layoutIfNeeded]
2.layoutSubviews-layoutSubviews
方法:這個方法,預設沒有做任何事情,需要子類進行重寫
layoutSubviews
在以下情況下會被呼叫:
- init初始化不會觸發
layoutSubviews
但是是用initWithFrame
進行初始化時,當rect的值不為CGRectZero時,也會觸發 -
addSubview
會觸發layoutSubviews
- 設定view的Frame會觸發
layoutSubviews
,當然前提是frame的值設定前後發生了變化 - 滾動一個UIScrollView會觸發
layoutSubviews
- 旋轉Screen會觸發父UIView上的
layoutSubviews
事件 - 改變一個UIView大小的時候也會觸發父UIView上的
layoutSubviews
事件
在蘋果的官方文件中強調:
You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews
, 當我們在某個類的內部調整子檢視位置時,需要呼叫。
反過來的意思就是說:如果你想要在外部設定subviews的位置,就不要重寫。
3.重繪-drawRect:(CGRect)rect
方法:重寫此方法,執行重繪任務-setNeedsDisplay
方法:標記為需要重繪,非同步呼叫drawRect-setNeedsDisplayInRect:(CGRect)invalidRect
方法:標記為需要區域性重繪
- 如果在UIView初始化時沒有設定rect大小,將直接導致
drawRect
不被自動呼叫。 - 該方法在呼叫
sizeThatFits
後被呼叫,所以可以先呼叫sizeToFit
計算出size。然後系統自動呼叫drawRect:
方法。 - 通過設定contentMode屬性值為UIViewContentModeRedraw。那麼將在每次設定或更改frame的時候自動呼叫
drawRect:
。 - 直接呼叫
setNeedsDisplay
,或者setNeedsDisplayInRect:
觸發drawRect:
,但是有個前提條件是rect不能為0.
以上1,2推薦;而3,4不提倡
- 若使用UIView繪圖,只能在
drawRect:
方法中獲取相應的contextRef並繪圖。如果在其他方法中獲取將獲取到一個invalidate的ref並且不能用於畫圖。drawRect:
方法不能手動顯示呼叫,必須通過呼叫setNeedsDisplay
或者setNeedsDisplayInRect
,讓系統自動調該方法。 - 若使用calayer繪圖,只能在
drawInContext:
中(類似魚drawRect)繪製,或者在delegate中的相應方法繪製。同樣也是呼叫setNeedDisplay
等間接呼叫以上方法。 - 若要實時畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來掉用
setNeedsDisplay
實時重新整理螢幕
小結:
-
layoutSubviews
對subviews重新佈局 -
layoutSubviews
方法呼叫先於drawRect
-
setNeedsLayou
t在receiver標上一個需要被重新佈局的標記,在系統runloop的下一個週期自動呼叫layoutSubviews
4.sizeToFit
-
sizeToFit
會自動呼叫sizeThatFits
方法; -
sizeToFit
不應該在子類中被重寫,應該重寫sizeThatFits
-
sizeThatFits
傳入的引數是receiver當前的size,返回一個適合的size -
sizeToFit
可以被手動直接呼叫 -
sizeToFit
和sizeThatFits
方法都沒有遞迴,對subviews也不負責,只負責自己
相關文章
- CSS佈局 --- 等寬&等高佈局CSS
- java:佈局方法(流佈局)Java
- 重溫 Flex 佈局Flex
- 等寬類表格佈局
- 渲染樹-佈局和繪製
- MT6169射頻應用說明和佈局指南
- Android 中LayoutInflater(佈局載入器)系列博文說明Android
- css佈局方法CSS
- LGWR DBWR SMON 等程式說明
- 使用說明
- Flutter佈局和繪製流程淺析Flutter
- 網頁佈局方法網頁
- 過等保流程簡單說明
- Qtum智慧合約使用方法及說明QT
- C++檔案說明及使用方法C++
- WebApiClientCore使用說明WebAPIclient
- QLExpress使用說明Express
- postman 使用說明Postman
- Sqlite使用說明SQLite
- certbot 使用說明
- cmake使用說明
- CSS佈局–聖盃佈局和雙飛翼佈局以及使用Flex實現聖盃佈局CSSFlex
- nofollow權重說明 nofollow是否傳遞權重?
- Qt 佈局中控制元件重疊、擠壓的解決方法QT控制元件
- CSS 佈局說——可能是最全的CSS
- CSS佈局說——可能是最全的CSS
- 使用 d3.js 力導佈局繪製資源拓撲圖JS
- QGIS列印佈局中繪製多個子圖
- Android測量佈局繪製的起點Android
- Android繪製優化(二)佈局優化Android優化
- JPA EntityManager使用說明
- wc 命令使用說明
- oracle orapwd使用說明Oracle
- Jupiter 使用說明
- BaseRecyclerViewAdapterHelper使用說明ViewAPT
- HSQL DB 使用說明SQL
- FreeSql 使用說明SQL
- linux mount掛載裝置(u盤,光碟,iso等 )使用說明Linux