tableView動(dòng)態(tài)行高

目錄

手寫(xiě)代碼和IB處理tableView動(dòng)態(tài)行高

手寫(xiě)代碼情況下,需要考慮的方面:

一、label單行與多行的區(qū)別

二、手寫(xiě)label背景填充跟著字來(lái)是否麻煩?

三、單行情況下,文字帶中文,設(shè)置行間距,計(jì)算出的高度不準(zhǔn)確。

備注


tableView是我們常用的控件之一,我們來(lái)談一談對(duì)于其行高的動(dòng)態(tài)設(shè)置。

手寫(xiě)代碼:

[string boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size

IB:

設(shè)定位置,不設(shè)定固定高,editor中設(shè)置sizeToFit,在heightForRow方法中給cell賦值后調(diào)用layoutIfNeeded方法。

(若想背景填充跟著字來(lái),設(shè)置label的width的less than最大寬度,字?jǐn)?shù)不足一行的,約束也會(huì)自動(dòng)縮到與label長(zhǎng)度匹配)

由于heightForRow會(huì)調(diào)用多次,在heightForRow中給cell賦值和調(diào)用layoutIfNeeded,性能會(huì)比較差。

解決方案:

1、根據(jù)id緩存每行的高度

2、設(shè)置預(yù)估行高

方案1、減少了調(diào)用cell賦值和layoutIfNeeded,性能相對(duì)提升。但是在獲取行高的方法里進(jìn)行了cell的賦值,結(jié)構(gòu)上不合理。

方案2、在固定行高的情況下合適,動(dòng)態(tài)行高的情況由于預(yù)估行高和實(shí)際行高的不同會(huì)出現(xiàn)列表跳動(dòng)。這樣說(shuō)來(lái),在固定行高的情況下設(shè)置預(yù)估行高能減少heightForRow的調(diào)用,提升性能。

手寫(xiě)和IB的區(qū)別:

手寫(xiě):僅僅是計(jì)算;

IB:程序一啟動(dòng)就會(huì)全部加載進(jìn)內(nèi)存由系統(tǒng)托管,先強(qiáng)制布局然后看占了多大的尺寸。

使用手寫(xiě)代碼的時(shí)候,有些東西需要考慮一下:

一、label單行與多行的區(qū)別

使用NSStringDrawingUsesLineFragmentOrigin

官方文檔的描述:

To correctly draw and size multi-line text, pass NSStringDrawingUsesLineFragmentOrigin in the options parameter.

多行文本draw或者獲取高度,需要有NSStringDrawingUsesLineFragmentOrigin在options參數(shù)中

我看到有不少人使用了NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading

不明白為什么要這樣使用?先看看官方文檔對(duì)兩個(gè)選項(xiàng)的描述:

NSStringDrawingUsesLineFragmentOrigin

The specified origin is the line fragment origin, not the base line origin

指定的原點(diǎn)是行片段的原點(diǎn), 而不是基線原點(diǎn)。

NSStringDrawingUsesFontLeading

Uses the font leading for calculating line heights

使用字體行距計(jì)算行高。

我看到文章有提出

1、NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading這種能解決有時(shí)高度不準(zhǔn)的問(wèn)題

2、在textView中,顯示行數(shù)是10行,使用NSStringDrawingUsesLineFragmentOrigin時(shí)只計(jì)算出了5行的高度,而使用NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading計(jì)算出了10行的高度

針對(duì)這兩個(gè)情況:

1、目前我使用中文、英文和中英文混合,使用NSStringDrawingUsesLineFragmentOrigin和使用NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading的效果一樣。

2、我通過(guò)UIFont獲取字高度,textView顯示了多少行,算出這幾行的高度,然后這些文字通過(guò)boundingRectWithSize:options: attributes: context:方法計(jì)算一下高度,發(fā)現(xiàn)使用NSStringDrawingUsesLineFragmentOrigin沒(méi)問(wèn)題。

UIFont中找到了兩個(gè)屬性:ascender、capHeight。第一個(gè)可以得到中文字體的實(shí)際顯示大小,第二個(gè)可以得到英文字母和數(shù)字的實(shí)際顯示大小

這樣看來(lái)使用要不要NSStringDrawingUsesFontLeading都一樣,如果有不同的意見(jiàn),請(qǐng)?jiān)谙路皆u(píng)論。

二、剛剛看IB背景填充跟著字?jǐn)?shù)來(lái)好像很簡(jiǎn)單,那么手寫(xiě)label背景填充跟著字來(lái)是否麻煩?

使用attributedText即可,好像也不麻煩。

三、單行情況下,文字帶中文,設(shè)置行間距,計(jì)算出的高度不準(zhǔn)確。

那么看看我們需要先確定的判斷條件:

1、是否設(shè)置行間距;

2、是否是單行;

3、是否帶中文;

那么如果滿足這三種情況的話,我將size高度中的lineSpacing減掉不就可以了,那么看代碼

這個(gè)時(shí)候運(yùn)行后會(huì)發(fā)現(xiàn)還是有問(wèn)題,size對(duì)了,但是label設(shè)置attributedText時(shí)帶了lineSpacing,字的顯示不對(duì),那么我需要將attributedText中的lineSpacing也去掉。


這個(gè)時(shí)候沒(méi)問(wèn)題了。以上方法都放在NSString+Private文件中。

備注:

官方文檔:

This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must raise its value to the nearest higher integer using the ceil function.

獲取的CGRect的值用一下ceil方法

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

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,167評(píng)論 1 92
  • 1.尺寸適配1.原因 iOS7中所有導(dǎo)航欄都為半透明,導(dǎo)航欄(height=44)和狀態(tài)欄(height=20)不...
    LZM輪回閱讀 6,389評(píng)論 1 4
  • 寫(xiě)在前面 iOS的的布局機(jī)制「auto layout」不是一個(gè)新概念,它早在iOS 6中就推出來(lái)了,當(dāng)下距離iOS...
    西門淋雨閱讀 1,622評(píng)論 2 4
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,780評(píng)論 8 183

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