UITableViewCell使用Autolayout

1.最简单的使用Autolayout的方法:(仅限于列表展示情况,不做任何界面跳转)

UITableViewCell使用Autolayout_第1张图片


(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;

}

UITableViewCell使用Autolayout_第2张图片

上面的方法返回一个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;

}


你可能感兴趣的:(UITableViewCell使用Autolayout)