iOS UITableView嵌套UICollectionView,动态高度

具备知识

UITableViewCell动态高度

cell上子视图是一个UICollectionView

需要让UICollectionView高度自适应

举例(让UITableView高度自适应)

动态高度.gif

实现思路

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 *)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));
        }];
    }
}

你可能感兴趣的:(iOS UITableView嵌套UICollectionView,动态高度)