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上实现了既定目标,感谢你们。