iOS 獲取到網(wǎng)絡(luò)數(shù)據(jù)后cell高度自適應(yīng)

由于網(wǎng)絡(luò)獲取到的數(shù)據(jù)有一定的時間,而創(chuàng)建tableview一般是在獲取到數(shù)據(jù)之前,在獲取到數(shù)據(jù)之后要刷新tableview,那么該如何更新適配文字的cell的高度呢。

我一般用到的方法是給自定義的cell添加一個更新lable的高度的方法。先預(yù)算出文字的高度,然后reloadData tableview的時候刷新即可。同時在viewcontroller里的heightForRowAtIndexPath方法里也需要預(yù)算出cell的高度,兩個高度要同時更改,具體代碼如下:

給自定義cell寫一個更改高度的方法:

.h
- (void)getModleWithString : (NSString *)TextStr;

.m
- (void)getModleWithString : (NSString *)TextStr{
    //拿到傳入的文字
    self.LableText.text = TextStr;
   //根據(jù)文字計算出高度,這里的寬度一定要算,如果lable兩邊有邊距,要用屏幕的寬度減去兩邊的間距作為這里計算的寬度
    CGRect rect = [TextStr boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width, 0) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil];
    //更改table的高度
    self.LableText.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, rect.size.height);
}

在ViewController中調(diào)用:

//調(diào)用cell中方法傳入數(shù)據(jù)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    LableTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse"];
    
    if (cell == nil) {
        cell = [[LableTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuse"];
        [cell getModleWithString:self.tableArr[indexPath.row]];
    }
    return cell;
}

//預(yù)算出文字高度,給出tableview的高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    CGRect rect = [self.tableArr[indexPath.row] boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width, 0) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil];
    //這里要給出lable的高度 + 其他控件的高度
    return rect.size.height + 10;
}

具體詳細了解有demo -> cell自適應(yīng)demo傳送門

iOS8新特性Self Sizing Cells可以自己適配cell高度

在iOS8蘋果推出一個可以自動適配cell高度的方法,很簡單,用xib約束好Lable的上下左右的邊距值后,不需要給高度,只需在tableview創(chuàng)建后寫下面兩句代碼

self.MTableView.estimatedRowHeight = 50.0f;//預(yù)算cell的平均高度,比如有2個cell,一個高度大概有80,另一個40,那么寫它們的平均值60即可
self.MTableView.rowHeight = UITableViewAutomaticDimension;//默認值

寫了以上兩句之后
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
這個方法可以不寫,會自動根據(jù)約束邊距的寬算出高度,并自動更改tableview的cell的高度。

但是這個方法只支持iOS8以上,而且聽說estimatedRowHeight這個預(yù)算值,如果和某個cell的高度相差特別大,可能滑動的時候會有看見跳動的變化,所以少量的cell個數(shù)可以考慮,但是我還沒有碰到跳躍的效果,具體用哪個方法,要根據(jù)實際情況大家自己選擇啦。

最后編輯于
?著作權(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)容