文章目录
  1. 1. UITableView 预估行高
  2. 2. UITableView 自适应行高
  3. 3. iOS 8 cell自适应
    1. 3.1. tableview中的cell只适应需要以下几点:
    2. 3.2. CollectionView 中的cell自适应

UITableView 预估行高

iOS7之后在UITableViewDelegate中新增的API-预估行高方法

1
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);

此方法放在自适应行高方法上方,tableview加载时候不会调用heightForRowAtIndexPath方法,而是estimatedHeightForRowAtIndexPath返回预估高度,然后tableview显示出来,等到cell可见时,再去调用heightForRowAtIndexPath获取cell的正确高度
代码如下:

1
2
3
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0){
return 90;
}

UITableView 自适应行高

实现方法

1
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPaht;

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
NSString *text = [_listArray objectAtIndex:indexPath.row];
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(_tableView.frame.size.width - 40, 1000)];
return size.height + 20;
} else {
CGFloat width = _tableView.frame.size.width - 40;
UIFont *font = [UIFont systemFontOfSize:17];
//方法1
CGRect rect = [text boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:nil];
// //方法2
// NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
// CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} options:NSStringDrawingUsesLineFragmentOrigin context:nil];
CGSize size = rect.size;
size.height = ceilf(size.height);
size.width = ceilf(size.width);
return size.height + 20;
}
}

iOS 8 cell自适应

在iOS 8 中,self size cell 提供了一种机制:cell如果有一个确定的宽度/高度,autolayout会自动根据cell中的内容计算出对应的高度/宽度。

tableview中的cell只适应需要以下几点:

1.设置的AutoLayout约束必须让cell的contentView知道如何自动延展,关键是contentView的4个边都要设置连接到内容约束,并且内容会动态改变尺寸的。
2.UITableView的rowHeight的值要设置为UITableViewAutomaticDimension
3.可以实现estimatedHeightForRowAtIndexPath方法提升tableview的第一次加载速度。
4.任何时候cell的intrinsicContentSize改变了(比如table view的宽度改变了),都必须重新加载table view
更新cell。
例子:
在Xcode中新建一个项目,在storyboard中创建一个UITableViewController的IB,创建一个如下cell

这个 cell 中有 3 个元素,其中 imageView 的 autoLayout 约束为:

imageView 左边离 contentView 左边 0

imageView 上边离 contentView 上边 0

imageView 的 width 和 height 为 80

imageView 下边离 contentView 下边大于等于 0(为了防止内容太少,导致 cell 高度小于图片高度)

titleLabel 的 autoLayout 约束为:

titleLabel 左边离 imageView 右边 8

titleLabel 上边和 imageView 上边在同一只线上

titleLabel 右边离 contentView 右边 0

titleLabel 下边离 description 上边 8

titleLabel 的高度小于等于 22,优先级为 250

descriptionLabel 的约束为:

descriptionLabel 左边和 titleLabel 左边在同一直线上

descriptionLabel 上边里 titleLabel 8

descriptionLabel 下边里 contentView 下边 0

descriptionLabel 右边离 contentView 右边 0

然后在这个 IB 对应的 UITableViewController 中加载一些数据进去,显示效果如图:

CollectionView 中的cell自适应

在collection view中也能让cell自适应内容大小,如果UICollectionView的layout时一个UICollectionViewFlowLayout,只需要将layout.itemSize = …改成layout.estimatedItemSize = …只要设置了layout得estimatedItemSize,collection view就会根据cell里面的autolayout约束去确定cell的大小。
原理:
1.collection view根据layout的extimatedItemSize估算出contentSize,有了contentSize collection view就开始显示
2.collection view在显示过程中,即将被显示的cell根据autolayout的约束计算出自适应内容的size
3.layout从collection view里获取更新过的sizeattribute
4.layout返回最终的size attribute给collection view
5.collection 使用这个最终的size attribute 展示 cell

文章目录
  1. 1. UITableView 预估行高
  2. 2. UITableView 自适应行高
  3. 3. iOS 8 cell自适应
    1. 3.1. tableview中的cell只适应需要以下几点:
    2. 3.2. CollectionView 中的cell自适应