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