IOS7環境實現自動計算TableViewCell高度的方法

Autolayout規則:view的frame受約束的控制。約束能夠直接影響自身的frame,也能夠影響其餘View的frame。數組

個人推測:subView與superView的某條邊有強約束(固定值的約束),當superView自己對這條邊沒有設置約束,會以subView的約束爲準。性能優化

試驗:性能

一、自定義一個Cell,拖一個label。設置cell的上下邊與Cell.contentView間距0,其餘約束隨意。這樣,lable對Cell的高度有了一個強約束。設置label的行數爲0,高度不設。測試

二、感謝網友提醒,這裏若是是iOS7,仍是須要設置Cell的高度,不過能夠很是簡化,具體作法以下:優化

a、在ViewController中建立一個Cell的屬性或成員變量,專門用於計算Cell高度。(作這一步是爲了性能優化)好比self.tempCellspa

b、改寫計算高度的回調code

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id entity = self.dataSourceArray[indexPath.row];
    if (self.tempCell == nil) {
        self.tempCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    }
    self.tempCell.bounds = CGRectMake(0,
                                      0,
                                      CGRectGetWidth(self.tableView.bounds),
                                      CGRectGetHeight(self.tempCell.bounds)
                                      );
    [self.tempCell resetCellWithEntity:entity];
        
    CGFloat height = [self.tempCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return height > 44 ? height : 44;
}

self.tempCell.bounds = xxxxxxorm

寫這行是由於tempCell建立出來後,默認寬度不必定符合實際狀況。it

c、在tempCell的resetCellWithEntity:方法中,加入相似這樣的代碼:table

self.testLable.preferredMaxLayoutWidth = self.frame.size.width;

這是由於UILable根據preferredMaxLayoutWidth的值計算高度。默認不設置,表示由系統自動計算。但自動計算僅在iOS8之後有效。iOS7的話,仍是須要手動設置的。


三、設置一個數據源,一個NSString的數組,放入長短不一樣的String進行測試,能夠發現顯示正常。



上述方法在iOS7真機上測試經過。


本次修改解決了討論區的各位兄弟指出的錯誤,真正在iOS7上實現了既定目標,感謝你們。

相關文章
相關標籤/搜索