iOS 視圖基礎(chǔ)知識點

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的時候。那么返回的sizelable.text的單行長度和單行高度。所以我們在使用sizeToFit函數(shù)來計算Label的高度的時候我們必須先保證labelwidth是確定的。這樣我們計算的高度才是我們需要的。此外還有一個點使我們注意的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,那么我們首先要知道tableviewcontentSize,計算公式:contentSize = cell1.height + cell2.height + cell3.height + ..... + celln.height。 所以tableview代理方法的效用順序,首先知道有幾個cell。所有調(diào)用了numberOfSectionnumberOfRowsInSection。
    當(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)用celllayoutsubviews方法。
  • 開啟預(yù)算。首先我們還是需要知道contentsize,那么這個值應(yīng)該怎么樣計算呢?調(diào)用了numberOfSectionnumberOfRowsInSection,我們便知道數(shù)量,然后contentsize = number * estimatedRowHeight; 這樣我們就可以預(yù)算出來了contentsize。這時候我們可以看出來我們計算的contentsize并不是正確的,但是我們并不在乎。contentszie的正確結(jié)果會在我們滑動的時候根據(jù)調(diào)用heightOfRow來計算出真正的值。這就為什么右側(cè)的滑動條在滑動的時候一直在變化。之后會按照正常的順序執(zhí)行cellOfRowheightOfRow。
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容