亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > iOS > 正文

你應(yīng)該知道的tableViewCell行高計算處理

2019-10-21 18:39:12
字體:
供稿:網(wǎng)友

前言

UITableView 是在app界面里非常常用的一個控件了,打開一個app,內(nèi)容列表 作者列表 朋友圈列表等等,,,都離不開 UITableView 。

而 UITableView 的精髓,則是在 UITableViewCell 展現(xiàn)的, 最常用的 自定義cell 有的行高是固定的,而大部分 則需要根據(jù)內(nèi)容來計算行高展示的。

下面就說說我在實際開發(fā)中處理cell行高的幾種情況:

1. 不需要動態(tài)計算高度

我在寫tableview時,基本都是自定義cell,而所有的自定義cell,都會繼承一個基類BaseTableViewCell:

.h里:

.h里:// 重用標(biāo)識+ (NSString *)reuseIdentifier;// cell高度+ (CGFloat)staticHeight;.m里:- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.opaque = NO; self.selectionStyle = UITableViewCellSelectionStyleNone; } return self;}// 重用標(biāo)識+ (NSString *)reuseIdentifier { return NSStringFromClass([self class]);}// cell高度+ (CGFloat)staticHeight { return 44.f;}

這樣寫的好處是,當(dāng)我們在使用tableview時,會方便我們對重用標(biāo)識符 行高使用,看一下:

tableViewCell,行高

staticHeight可以在子類的自定義cell里更改設(shè)置,使用時:

tableViewCell,行高

這樣寫,更能清晰明了的看到對每個自定義cell的設(shè)置,也會讓代碼看上去優(yōu)雅整齊一些。

2. 動態(tài)計算高度

實際開發(fā)中,使用最多的應(yīng)該是動態(tài)計算cell高度了,這也是tableView很基本的一個功能。

比如搜索資訊這塊:

tableViewCell,行高

標(biāo)題高度不固定,內(nèi)容高度不固定,標(biāo)簽不固定,這樣的就需要根據(jù)model里的內(nèi)容計算行高了:

tableViewCell,行高

用的時候,在tableview的代理里設(shè)置:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {  WMSearchResultQAModel *model = self.dataArray[indexPath.row];  return [WMSearchResultQAModel calutWholeCellHeightWithModel:model];}

這樣就可以達(dá)到每個cell根據(jù)內(nèi)容展示不同高度的要求了。

這種方法很繁瑣,但是也是最精確的,最可控的,都支持autolayout和frame。

3. 動態(tài)計算 - 緩存高度

為什么要緩存高度?

因為當(dāng)tableView滾動時會不停的回調(diào) heightForRowAtIndexPath 這個代理方法,當(dāng)cell的高度需自適應(yīng)內(nèi)容時,就意味著每次回調(diào)這個方法時都要計算高度,而計算是要花時間了,在用戶體驗上的體現(xiàn)就是卡頓,眾所周知 60fps是比較符合人眼審視的,如果幀數(shù) 低于這個數(shù)值過多,就會明顯感受到卡幀等現(xiàn)象,為了讓用戶體驗比較好些,我們就要對高度計算進(jìn)行優(yōu)化。

思路:為了避免重復(fù)且無意義的計算cell高度,緩存高度就顯得尤為重要了。

緩存高度機制

緩存高度 我們需要一個容器來保存高度數(shù)值,可以是model 可以是一個可變數(shù)組 也可以是一個可變字典,以達(dá)到每當(dāng)回調(diào) heightForRowAtIndexPath 這個方法時,我們先去這個緩存里去取,如果有,就直接拿出來,如果沒有,就計算高度,并且緩存起來。

以model為例:

在model里聲明個cellHeight屬性,用于保存Model所對應(yīng)的Cell的高度,然后在 heightForRowAtIndexPath 方法中,如果當(dāng)前Model的cellHeight為0,說明這個Cell沒有緩存過高度,則計算Cell的高度,并把這個高度記錄在Model中,這樣下次再獲取這個Cell的高度,就可以直接去Model中獲取,而不用重新計算:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { WMSearchResultQAModel *model = self.dataArray[indexPath.row]; if (model.cellHeight > 0) {  // 有緩存的高度,取出緩存高度  return model.cellHeight; } // 沒有緩存時,計算高度并緩存起來 CGFloat cellHeight; = [WMSearchResultQAModel calutWholeCellHeightWithModel:model]; // 緩存給model model.cellHeight = cellHeight; return cellHeight;}

這樣就實現(xiàn)了高度緩存和Model、Cell都對應(yīng)的優(yōu)化,我們無需手動管理高度緩存,在添加和刪除數(shù)據(jù)的時候,都是對Model在數(shù)據(jù)源中進(jìn)行添加或刪除。

而如果使用可變數(shù)組或可變字典時,則需要額外的在刷新tableView時對其進(jìn)行清空處理。

4. 自適應(yīng)高度

在 iOS8 之后,系統(tǒng)結(jié)合autolayout提供了動態(tài)結(jié)算行高的方法 UITableViewAutomaticDimension,做好約束,我們都不用去實現(xiàn) heightForRowAtIndexPath 這個代理方法了。

masonry支持毫無壓力。

實現(xiàn)步驟:

1、tableView設(shè)置

// 預(yù)設(shè)行高self.tableView.estimatedRowHeight = xxx;// 自動計算行高模式 self.tableView.rowHeight = UITableViewAutomaticDimension;

2、在自定義cell里,masonry布局,比如:

- (void)layoutSubviews { [super layoutSubviews]; [self.headImgView mas_makeConstraints:^(MASConstraintMaker *make) {  make.top.left.offset(kSpace15);  make.size.mas_equalTo(CGSizeMake(50.f, 50.f));  // 在自動計算行高模式下 要加上的   make.bottom.equalTo(self.contentView.mas_bottom).offset(-kSpace15); }]; [self.nickNameLabel mas_makeConstraints:^(MASConstraintMaker *make) {  make.left.equalTo(self.headImgView.mas_right).offset(12.f);  make.top.offset(17.f); }]; [self.jobWorkLabel mas_makeConstraints:^(MASConstraintMaker *make) {  make.left.equalTo(self.nickNameLabel.mas_right).offset(8.f);  make.right.lessThanOrEqualTo(self.contentView.mas_right).offset(-kSpace15);  make.top.offset(21.f); }]; [self.hospitalLabel mas_makeConstraints:^(MASConstraintMaker *make) {  make.left.equalTo(self.headImgView.mas_right).offset(12.f);  make.top.equalTo(self.jobWorkLabel.mas_bottom).offset(6.f); }]; [self.line mas_makeConstraints:^(MASConstraintMaker *make) {  make.left.right.bottom.offset(0);  make.height.mas_equalTo(0.5f); }];}

布局時兩個注意點:

· 所有子控件,都要依賴與self.contentView作為約束父控件,而不是self(cell)

· 關(guān)鍵控件要做bottom約束 (因為不再指定行高,所以要需要給出根據(jù)bottom的約束)

3、最關(guān)鍵的一步: [cell layoutIfNeeded]

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { WMDoctorEvaluateDescribeInputCell *cell = [tableView dequeueReusableCellWithIdentifier:[WMDoctorEvaluateDescribeInputCell reuseIdentifier] forIndexPath:indexPath]; kWeakSelf cell.describeInputBlock = ^(NSString * _Nonnull describeText) {   weakSelf.inputDescribeText = describeText;  }; //關(guān)鍵的一步,解決不正常顯示問題 [cell layoutIfNeeded]; return cell;}

這樣就完成了自動適應(yīng)高度的要求了。

另外:

針對一些自動適應(yīng)高度不好做的cell,可以單獨處理 如下:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 2) {   return [WMDoctorEvaluateStarCell staticHeight]; } return UITableViewAutomaticDimension;}

5.自適應(yīng)高度 - 緩存行高

在用UITableViewAutomaticDimension,有的界面比較復(fù)雜,雖然這樣能完成顯示,但是在滑動的過程中,能肉眼感受到卡 掉幀,眾所周知 60fps是比較符合人眼審視的,如果幀數(shù) 低于這個數(shù)值過多,就會明顯感受到卡幀等現(xiàn)象,這屬于優(yōu)化性能方面的問題,所以就要思考一下怎樣來達(dá)到優(yōu)化tableview性能。

思路:

緩存高度機制

首先獲取cell實際顯示的高度

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { NSString *key = [NSString stringWithFormat:@"%ld", (long)indexPath.row]; [self.heightDict setObject:@(cell.height) forKey:key]; NSLOG(@"第%@行的計算的最終高度是%f",key,cell.height);}

//didEndDisplayingCell 當(dāng)cell滑出屏幕時會觸發(fā)此方法,是cell已經(jīng)被真正的顯示在了屏幕上,所以在這里打印出的高度必然是最正確的高度。根據(jù)indexPath.row作為key,將高度緩存進(jìn)字典.

然后在 heightForRowAtIndexPath 方法里判斷,如果字典里有值,則使用緩存高度,否則自動計算:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ NSString *key = [NSString stringWithFormat:@"%ld",indexPath.row]; if (self.heightDict[key] != nil) {  NSNumber *value = _heightDict[key];  return value.floatValue; } return UITableViewAutomaticDimension;}

注意:設(shè)置cell的預(yù)估高度時一定要設(shè)置最小高度cell的那個值。不然的話,在滑動的時候,當(dāng)高度最小的那個滑動到一大半的時候,就會突然一下消失,造成掉幀的現(xiàn)象。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲色图21p| sese在线播放| 国产成人久久久| 5278欧美一区二区三区| 香蕉视频免费在线看| 亚洲精品国产精品乱码不99| av在线免费播放| av小次郎收藏| 黄色高清视频在线观看| 99pao成人国产永久免费视频| 亚洲精品视频网址| 国产农村老头老太视频| 日韩福利视频一区| 亚洲av综合色区| 国产精品综合色区在线观看| 99久久久精品免费观看国产| 欧美三级一区二区三区| 成全在线观看免费完整动漫| 一区二区三区四区不卡视频| 午夜午夜精品一区二区三区文| 国产精品久久久久久久久快鸭| 免费欧美网站| 国产精品美女久久久久久2018| 亚洲av成人精品毛片| 久久久久久无码午夜精品直播| 精品伊人久久| 影音先锋日韩有码| 视频一区视频二区视频三区高| 国偷自产一区二区免费视频| 国产美女网站视频| 国产·精品毛片| 九九九久久久| 精品一区二区三区免费站| 国产亚洲精品女人久久久久久| 欧美在线观看网址综合| 欧美国产日韩在线播放| 成人美女在线视频| 久久影音资源网| 精品国产一区二区三区久久久狼牙| 日本少妇精品亚洲第一区| 日韩欧美国产电影| 国产亚洲第一页| 久久久久久成人| 在线播放亚洲精品| 我要看一级黄色录像| а天堂中文在线资源| 国产成人短视频在线观看| 中文字幕一区免费在线观看| 免费黄网站在线播放| 亚洲精品视频一区二区| 国产精品久久久久久久泡妞| 中文字幕不卡一区| 国产欧美日韩精品一区| 欧美成人精品福利在线视频| 欧美另类69精品久久久久9999| 91狠狠综合久久久| 老司机凹凸av亚洲导航| 日本在线高清| 黄色片视频免费观看| av在线第一页| 国产a一区二区| 国产一区二区在线播放视频| 99精品视频在线观看播放| 97视频久久久| 亚洲午夜免费| 精品欧美一区二区精品少妇| 婷婷久久国产对白刺激五月99| 国产精品午夜国产小视频| 在线看的黄色网址| 国产一区二区高清视频| 亚洲一区二区在线观看视频| 亚洲国内自拍| 亚洲av激情无码专区在线播放| 粉嫩精品久久99综合一区| 日韩特黄一级片| 欧美精品123| 国产成人av一区二区三区不卡| 国产又粗又爽又黄的视频| 青青操在线观看| av老司机在线观看| 久久不射热爱视频精品| 97人人模人人爽人人喊38tv| 日韩亚洲欧美中文三级| 日韩一区二区三区在线| 性欧美video另类hd尤物| 国产性色一区二区| 人妻中文字幕一区二区三区| 国产福利精品一区二区| 久久免费影院| 欧美色男人天堂| 亚洲成年人专区| 成人全视频在线观看在线播放高清| 久久久久久久免费视频了| 欧美色欧美亚洲另类七区| 成人精品一区二区三区| 秋霞午夜鲁丝一区二区| 欧美酷刑日本凌虐凌虐| 国内一区二区视频| 国产精品久久久久久福利一牛影视| 欧美丰满老妇熟乱xxxxyyy| 北条麻妃视频在线| 亚洲一区欧美二区| 三级黄色视屏| 69av在线播放| 日韩在线观看中文字幕| 免费在线成人网| youjizzxxxx18| 精品国产一区二区三区av片| 欧美激情一区二区三区四区| 日韩中文在线中文网在线观看| 欧洲在线一区| 黄色一级大片在线免费看产| 免费日韩在线观看| 天天舔天天干天天操| 91日韩在线视频| 国产精品永久入口久久久| 色综合天天狠天天透天天伊人| 欧美特黄一区二区三区| 国外成人在线播放| 欧美成人一区二区视频| 中文字幕一区二区精品| 中文娱乐网av| 在线亚洲免费| 日韩成人久久久| 黄色片在线播放| 日本美女久久| 91.麻豆视频| 中文字幕亚洲欧美| 欧美色倩网站大全免费| 日韩欧美在线视频日韩欧美在线视频| 欧美视频在线播放| 欧美性xxxxxbbbbbb精品| 日本免费成人网| 欧美精品一区二区高清在线观看| 亚洲福利精品在线| 国内小视频在线看| 国产欧美一区二区三区不卡高清| 黄色av免费在线看| 丁香色欲久久久久久综合网| 亚洲一区二区免费在线观看| 欧美va天堂在线| 免费欧美日韩| a级片在线免费| 在线观看免费高清视频| xxx欧美精品| 日韩和欧美一区二区三区| 麻豆av一区二区三区久久| 国产又粗又大又爽的视频| 在线性视频日韩欧美| 91po在线观看91精品国产性色| 国产农村妇女aaaaa视频| 欧美另类在线播放| 亚洲成人黄色影院| 亚洲国产另类久久久精品极度| 亚洲色成人www永久网站| 日韩网红少妇无码视频香港| 欧美日韩在线一区| 加勒比海盗1在线观看免费国语版| 欧美精品久久96人妻无码| 亚洲免费观看| 亚欧洲精品在线视频免费观看| 美女在线免费视频| 日本中文字幕精品| 一区二区电影| 国产亚洲精品熟女国产成人| 天天做天天爱天天爽综合网| 久久精品国产综合| 俺去亚洲欧洲欧美日韩| 欧美裸体bbwbbwbbw| 欧美日韩国产精品一区二区亚洲| 亚洲码在线观看| 欧美成人久久久免费播放| 岛国在线视频免费看| 亚洲成人一级片| 亚洲热线99精品视频| 亚洲精品一区二区三区在线观看| 日韩成人在线播放| 领导边摸边吃奶边做爽在线观看| 热久久久久久| 国产综合免费视频| 亚洲免费一区二区| 在线午夜视频| 国产香蕉97碰碰久久人人| 天天操中文字幕视频| 在线色视频网| 中文字幕一区二区人妻痴汉电车| 亚洲加勒比久久88色综合| 欧美日韩国产精品自在自线| 在线免费福利| 美洲精品一卡2卡三卡4卡四卡| 99久久免费精品国产免费| 中文字幕资源在线观看| 亚洲成人精品久久| 亚洲v国产v在线观看| 国产麻豆一精品一男同| caoporn国产精品免费视频| 欧美日韩五码| 偷拍国模大尺度视频在线播放| 精品一区二区av| 嘿嘿视频在线观看| 自拍偷拍欧美| 国产精品成人av性教育| 天天干天天操天天爽| 先锋影音一区二区三区| 一本一道久久a久久精品逆3p| 最新地址在线观看| 久草在线免费福利资源| 亚洲综合一区二区精品导航| 国产精品99久久久久久似苏梦涵| 超碰在线97av| 99久久免费看精品国产一区| 国产精品免费av| 亚洲h色精品| av网页在线观看| 亚洲精品久久久久久下一站| 97精品欧美一区二区三区| 视频区 图片区 小说区| 美女福利一区二区三区| 黄视频网站在线观看| 99久久国产综合精品女不卡| 久久久久亚洲精品一区二区三区| 日韩视频免费播放| 欧美a视频在线| 97视频精品| 超碰在线最新网址| 日本三级网站在线观看| 亚洲国产另类精品专区| 2021久久精品国产99国产精品| 免费毛片网站在线观看| 麻豆传媒在线看| 国产99在线观看| 欧美一区二区三区免费在线看| 国产成人精品av久久| 日韩日韩日韩日韩日韩| 成人动漫网站在线观看| 97视频人免费观看| 亚洲一区精品视频在线观看| 一区二区三区视频在线观看视频| 中文字幕人妻一区二区在线视频| 国产精品国产精品88| 成人91免费视频| 国产高清在线观看视频| 国产一区二区日韩精品| 4480yy私人影院高清不卡| 精品久久久久久久久中文字幕| 精品国产aaa| 3d动漫啪啪精品一区二区免费| 中文字幕网站在线观看| 在线播放国产一区二区三区| 亚洲国产日韩在线一区模特| 久久久美女艺术照精彩视频福利播放| 国产成人一区二区在线| 日韩激情第一页| 激情久久综合网| 日韩欧美大尺度| 国产精品69久久久久| 日本女人一区二区三区| 欧美二区在线播放| 黄色免费网站观看| 国产激情小视频| 国产日韩亚洲欧美| 成人免费网站在线观看视频| 人体私拍套图hdxxxx| 欧美丝袜美女中出在线| 亚洲伊人成人网| 97超碰资源站| 国产在线不卡精品| 国产精品久久久久久在线| 老司机深夜福利网站| 成人午夜精品无码区| 亚洲天堂网2018| 亚洲性色视频| 日韩欧美国产大片| 亚洲国产第一区| 免费a级人成a大片在线观看| 中文字幕日产av一二三区| 综合操久久久| 成人爱爱网址| 亚洲天堂久久av| xxx国产在线观看| 欧美极品少妇与黑人| 欧美日韩999| caoporm免费视频在线| 成人av免费电影| 91精品国产网站| 久久国产一二区| 91精品秘密在线观看| 影视先锋av资源站| 国产又大又粗又硬| 日韩三级影视| 成人h动漫在线| 亚洲男人的天堂网站| 黄色毛片av| 最近免费看av| 欧美日韩一区二区欧美激情| 日韩中文字幕av电影| 国产精品夜色7777狼人| 欧美乱偷一区二区三区在线| 欧美精品一区二区三| 大胆人体色综合| 成人在线免费观看视频网站| 色涩视频在线观看| 在线视频二区| 日本欧洲国产一区二区| 一本一本久久a久久精品牛牛影视| 91社区在线观看| 亚洲国产第一| 婷婷亚洲五月| 我的公把我弄高潮了视频| 一区二区视频在线免费| 精品久久久久久无码国产| 欧洲大片精品免费永久看nba| 亚洲欧洲av一区二区| 波多野结衣在线影院| 国产一区二区视频免费在线观看| 伊人久久综合97精品| 欧美主播一区二区三区美女| 精品久久久久国产| 91短视频版在线观看www免费| 欧美激情精品久久久久久免费印度| 91视频论坛| 99热在这里有精品免费| 美女性感视频久久久| 最近高清中文在线字幕在线观看| 特级西西人体4444xxxx| 在线黄色国产视频| 少妇高潮喷水久久久久久久久久| 欧美性生活大片免费观看网址|