iOS 檢視基礎知識點
1、sizeThatFit:
和sizeToFit
兩個方法的含義
-
sizeToFit
方法呼叫sizeThatFit:(CGSize)size
,而size
的值是檢視的frame.size
。當獲取到方法sizeThatFit:
返回的size
的時候會賦值給檢視。 -
案例,當
Label
呼叫函式sizeThatFit
,引數是CGSizeZero
的時候。那麼返回的size
是lable.text
的單行長度和單行高度。所以我們在使用sizeToFit
函式來計算Label
的高度的時候我們必須先保證label
的width
是確定的。這樣我們計算的高度才是我們需要的。此外還有一個點使我們注意的 lable 的屬性numberOfLines = 0
1、width 一定
2、numberOfLines = 0;
2、layoutsubviews
呼叫順序
-
先呼叫父檢視的
layoutsubviews
,在呼叫子檢視的layoutsubviews
。 -
呼叫
setNeedsLayout
表示檢視需要在下一個runloop
中呼叫layoutSubViews
,會有延遲。如果希望立即執行可以再加上這句話layoutIfNeeded
,這樣會立即呼叫layoutsubviews
。
3、UITableView
的Cell高度計算
3.1estimateRowHeight
estimateRowHeight
是否開啟自動預算高度,在iOS11
的時候預設是開啟的UITableViewAutomaticDimension = -1
。如果想要關閉那麼你需要手動設定tableview.estimatedRowHeight = 0;
這樣可以關閉預算高度。如果你實現了estimate代理方法,其他的設定將無效,你開啟了預算高度。
3.2estimateRowHeight
的開啟和關閉的不同。
-
沒有開啟預算高度,就是平常
tableview
。首先我們瞭解一下tableview
的生成。tableview
繼承UIScrollView
,那麼我們首先要知道tableview
的contentSize
,計算公式:contentSize = cell1.height + cell2.height + cell3.height + ..... + celln.height
。 所以tableview
代理方法的效用順序,首先知道有幾個cell。所有呼叫了numberOfSection
和numberOfRowsInSection
。
當知道數量的時候,我們需要知道每個cell的高度,所以我們要呼叫heightOfRow
。這樣我們就可以計算出'tableview.contentSize'。
這時候我們可以看出來我們現在還並不關心cell
是否生成,是什麼樣子。我們只在意他們的高度 。當我們計算完contentsize
的時候我們要生成cell
。所以我們呼叫了'cellOfRow'代理方法,返回一個cell
,之後我們會在呼叫'heightOfRow'。這時候返回的高度就是cell的真實高度,之後會把高度賦值cell.frame.size.height
,之後會呼叫cell
的layoutsubviews
方法。 -
開啟預算。首先我們還是需要知道
contentsize
,那麼這個值應該怎麼樣計算呢?呼叫了numberOfSection
和numberOfRowsInSection
,我們便知道數量,然後contentsize = number * estimatedRowHeight
; 這樣我們就可以預算出來了contentsize
。 這時候我們可以看出來我們計算的contentsize
並不是正確的,但是我們並不在乎。contentszie的正確結果會在我們滑動的時候根據呼叫heightOfRow
來計算出真正的值。 這就為什麼右側的滑動條在滑動的時候一直在變化。之後會按照正常的順序執行cellOfRow
和heightOfRow
。
3.3 遇到的坑
-
tableview滑動到頂部程式碼
tableview.contentoffset = cgpointzero
。當我們開啟預算的時候,這段程式碼並不起作用,因為我們的contensize是假的。
3.4專案中計算Cell的兩種常用方案
-
Cell
類中有一個例項方法或者類方法cellHeightWithModel:
,根據model中的資料,主要使用方法NSString -sizeWithAttributes
來計算各個控制元件的高度,最後整合在一起生成最終的高度。 -
先把model賦值給cell,cell中的各個控制元件都是有值得。之後呼叫控制元件的
sizeToFit
來計算出各個控制元件的高度,之後再整合出來cell
的高度。
這兩個區別就在於我們時候需要一個例項化cell,第一種方案是不需要cell例項的,但是第二種是必選需要一個例項化cell