UITableView高度問題


原理:TableView繼承自UIScrollView瞒渠。所以先要求要有contentView的尺寸唠亚,然后具體顯示某個(gè)cell的時(shí)候再計(jì)算cell的高度。所以每次cell顯示的時(shí)候都要重新計(jì)算他的高度皱炉。


二種方案:

一:計(jì)算具體cell真實(shí)高度兑巾。

  • 原理:若有row height或者- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;通過他們直接計(jì)算出TableView的contentView高度。當(dāng)顯示某個(gè)cell的時(shí)候直接調(diào)用他們顯示饰剥。優(yōu)先級(jí)最高殊霞。

  • 方法可以才用手動(dòng)計(jì)算cell的高度,緩存cell的高度避免每次計(jì)算汰蓉。每次顯示的時(shí)候先看緩存里面有cell的高度沒有绷蹲,沒有就計(jì)算,計(jì)算了放入緩存顾孽。cell的高度最好放入Model模型祝钢。

二:采用預(yù)估高度,采用約束計(jì)算cell真實(shí)高度若厚。

  • 原理:若無row height或者- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;通過estimatedRowHeight或者- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);計(jì)算出估算的contentView的高度拦英。iOS8之后tableView的row height默認(rèn)設(shè)置為UITableViewAutomaticDimension, 這個(gè)時(shí)候具體的某個(gè)cell的高度由cell的布局自動(dòng)計(jì)算高度测秸。

  • 預(yù)估高度越接近真實(shí)高度越好疤估,若差別過大會(huì)出現(xiàn)tableView閃爍跳躍。若cell的高度變化范圍過大且不確定霎冯,可用代理設(shè)置預(yù)估高度铃拇。第一次將要顯示的時(shí)候

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    NSInteger height = cell.height;
    [self.cellHeightDic setObject:@(height) forKey:indexPath];
}

可以得到真實(shí)高度,然后把高度放入緩存預(yù)估高度數(shù)組肃晚。取預(yù)估高度的時(shí)候先看有沒有緩存高度有就用緩存高度锚贱,沒有就用平均高度仔戈。這里由于后面滑動(dòng)的時(shí)候數(shù)組里面都已經(jīng)有了預(yù)估高度且預(yù)估高度就是真實(shí)高度关串,所以完成不會(huì)出現(xiàn)閃爍跳躍現(xiàn)象且真實(shí)高度就是預(yù)估高度,所以從 預(yù)估—>真實(shí) 這一過程就可以忽略影響监徘,達(dá)到類似高度緩存的效果晋修。

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSNumber *height = [self.cellHeightDic objectForKey:indexPath];
    if(height)
    {
        
        return height.floatValue;
    }
    else
    {
        return 100;
    }
}
  • cell的布局要求:cell的contentView的子視圖支持起contentView,即每個(gè)子視圖上下左右都要有約束凰盔,且可以把高度累加墓卦,若有大小不固定的圖片最好把圖片的尺寸放入到url里面。若有webView户敬,有待學(xué)習(xí)落剪。

  • 當(dāng)滑動(dòng)到某個(gè)cell的時(shí)候每次都要計(jì)算cell的高度睁本,這比較費(fèi)時(shí)間可以采第三方UITableView+FDTemplateLayoutCell緩存cell的高度。注意cell中的label先設(shè)定換行寬度忠怖,否則要奔潰在高度緩存呢堰。 這個(gè)第三方好像在iOS10效果不明顯,且有卡頓現(xiàn)象樣凡泣,所以除非系統(tǒng)非惩魈郏卡頓才嘗試用該第三方。

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
    self.userName.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 66;
    self.descLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
    
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [tableView fd_heightForCellWithIdentifier:identify cacheByIndexPath:indexPath configuration:^(MKJTableViewCell *cell)
            {
                [self configCell:cell indexpath:indexPath];
            }];
}
  • 若只有某些cell需要計(jì)算高度鞋拟,某些高度固定死了骂维。采用:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 3) {
        return 20;//固定死
    }else{
        return UITableViewAutomaticDimension;//采用約束計(jì)算的。
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贺纲,一起剝皮案震驚了整個(gè)濱河市航闺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猴誊,老刑警劉巖来颤,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異稠肘,居然都是意外死亡福铅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門项阴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滑黔,“玉大人,你說我怎么就攤上這事环揽÷缘矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵歉胶,是天一觀的道長(zhǎng)汛兜。 經(jīng)常有香客問我,道長(zhǎng)通今,這世上最難降的妖魔是什么粥谬? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辫塌,結(jié)果婚禮上漏策,老公的妹妹穿的比我還像新娘。我一直安慰自己臼氨,他們只是感情好掺喻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般感耙。 火紅的嫁衣襯著肌膚如雪褂乍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天即硼,我揣著相機(jī)與錄音树叽,去河邊找鬼。 笑死谦絮,一個(gè)胖子當(dāng)著我的面吹牛题诵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播层皱,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼性锭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了叫胖?” 一聲冷哼從身側(cè)響起草冈,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓮增,沒想到半個(gè)月后怎棱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绷跑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拳恋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸捏。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谬运,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垦藏,到底是詐尸還是另有隱情梆暖,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布掂骏,位于F島的核電站轰驳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弟灼。R本人自食惡果不足惜莱没,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一刽射、第九天 我趴在偏房一處隱蔽的房頂上張望词顾。 院中可真熱鬧娜搂,春花似錦薛闪、人聲如沸辛馆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昙篙。三九已至腊状,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苔可,已是汗流浹背缴挖。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焚辅,地道東北人映屋。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像同蜻,于是被迫代替她去往敵國(guó)和親棚点。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容