具备知识
UITableViewCell动态高度
cell上子视图是一个UICollectionView
需要让UICollectionView高度自适应
举例(让UITableView高度自适应)
实现思路
1.使用Masonry对UITableView进行左、右、上约束
2.通过改变UITableView的行数来让UITableView实现动态高度
3.需要重写UITableView的layoutSubviews方法和intrinsicContentSize属性(核心)
重写代码:
- (void)layoutSubviews {
[super layoutSubviews];
// 如果不相等就更新
if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
[self invalidateIntrinsicContentSize];
}
}
- (CGSize)intrinsicContentSize {
return self.contentSize;
}
intrinsicContentSize
它是一个视图的固有大小,改变它就能改变视图的大小,可它是一个只读属性,我们只能通过以上方法来改变它。
我们一般的思路是监听UITableView的contentSize的变化,然后再根据contentSize的大小改变UITableView的大小。使用上面的方式就不用我们去监听contentSize的变化以及手动更改UITableView的约束了。
demo地址:https://github.com/yangguanghei/DynamicTableView
监听的方式动态改变UITableView的高度
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = UIColor.orangeColor;
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.view);
make.top.equalTo(self.view.mas_top).offset(100);
}];
lines = 2;
[self.tableView reloadData];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"改变行数" style:UIBarButtonItemStyleDone target:self action:@selector(changeLines)];
[self.tableView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentSize"]) {
[self.tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.view);
make.top.equalTo(self.view.mas_top).offset(100);
make.height.equalTo(@(self.tableView.contentSize.height));
}];
}
}