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上實現了既定目標,感謝你們。