1.最简单的使用Autolayout的方法:(仅限于列表展示情况,不做任何界面跳转)
(1)这是我cell里面的一些布局大家可以简单尝试一下:
这个 cell 中有 3 个元素,其中 imageView 的 autoLayout 约束为:
imageView 左边离 contentView 左边 0
imageView 上边离 contentView 上边 0
imageView 的 width 和 height 为 80
imageView 下边离 contentView 下边大于等于 0(为了防止内容太少,导致 cell 高度小于图片高度)
Title 的 autoLayout 约束为:
Title 左边离 imageView 右边 8
Title 上边和 imageView 上边在同一只线上
Title 右边离 contentView 右边 0
Title 下边离 description 上边 8
Title 的高度小于等于 22,优先级为 250
Label 的约束为:
Label 左边和 titleLabel 左边在同一直线上
Label 上边里 titleLabel 8
Label 下边里 contentView 下边 0
Label 右边离 contentView 右边 0
(2)创建一个tableView,加入到一个ViewController里面。tableView里面的一些代理自己设置。其中我们常用的一个用于设置cell高度的方法- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;替换成方法:- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{return UITableViewAutomaticDimension;
}
上面的方法返回一个cell的估计值。或者也可以不写方法直接写句代码self.tableOne.rowHeight = UITableViewAutomaticDimension;
上面的方法可以不用计算cell的高度。大大提高了加载速度;这样说吧比如你有1W个Cell的单元你必须计算1W次的单元格高度的方法。但是使用上面的方法就不用计算了。节省了许多时间;
但是上面的方法在处理界面的跳转的时候(由于系统本身机制的原因)tableView会重新被加载。所以界面返回当前的tableView的时候,table会滑动在最顶端(而不是你点击cell的那个位置)——>所以这个方法只适用于列表展示,而不做其他操作;
2.使用autolayout并且可以做一系列的界面处理(计算高度)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
//获取高度
return [self heightForBasicCellAtIndexPath:indexPath];
}
//获取高度
- (CGFloat)heightForBasicCellAtIndexPath:(NSIndexPath *)indexPath {
//获取一个单例cell,用来计算高度
static MyCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self.tableOne registerNib:[UINib nibWithNibName:@"MyCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"mycell"];
sizingCell=[self.tableOne dequeueReusableCellWithIdentifier:@"mycell"];
});
//加载单例cell的数据(self.items是文字的数组)
sizingCell.contentLabel.text = [self.items objectAtIndex:indexPath.row];
//设置cell中的label的约束的最大值, 如果没设置, 在[sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]这个得到的高度不够准确, 所以需要具体设置的宽度,以便能够获取准确地值
sizingCell.contentLabel.preferredMaxLayoutWidth = ScreenWidth-106;
//可以直接在这里计算 但是我不建议, 因为这样子也有可能造成得到的高度不准确, 建议用下面注释掉的return 但也要看具体情况了, 说不定通过下面那个也会不准确
CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height + 1.0f;
}