让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局

文章概要:

1、简介下,tableView中的内容如何高度自适应的布局

2、如何做到让tableView的高度动态调整


还是看图作文吧~

首先,tableView的高度就是用户能够看见里面更大世界的那个窗口的大小,一般是固定的。

然后在cell里面布局的时候,像图中粉红色的view展示的内容需要全部展示出来,这样的话这个粉红view的高度就需要是动态变化的。比如一个UILabel,因为它是属于有内置大小的控件(自身的size通过其内部的内容所决定可以自身计算出来的控件),你只需要设置这个label的原点(x,y)和宽度就行了,当然还要设置lineNumber = 0(不限制行数)。然后cell的高度不要设定成固定数值,cell的高度由内部view决定。

tableView是scrollView的子类,那如何设置contentSize呢?由最后一个cell的底部决定。

OK。这就是我们一般做的tableViewCell高度自适应的布局方式,思维发散下,我们直接用scrollView的时候,设置contentSize也要用这种布局策略:由内部决定外部。

-----------

然后第二个需求是这样的:打开软件弹出赠送的优惠券列表,优惠券多的情况下就固定tableView的高度,让里面的内容可以滚动。如果优惠券少的情况下,里面的内容不足以滚动的情况下,就让tableView本身的高度变为“刚好”能展示里面的内容就行了。

将这个需求转化为技术语言的话就是,给定tableView的contentView一个最大的高度MaxHeight,如果contentView的真实高度小于MaxHeight的时候,tableView的高度就是contentView的真实高度,如果contentView的真实高度大于MaxHeight的时候,tableView的高度就固定在MaxHeight。

实现代码:

- (void)setupMonitor {
    [self.homePageCouponsTableView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    CGRect tableFrame = self.homePageCouponsTableView.frame;
    tableFrame.size = self.homePageCouponsTableView.contentSize;
    if (tableFrame.size.height < 280) {
        [self.homePageCouponsTableView mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(10);
            make.left.mas_equalTo(self.bgView.mas_left).offset(15);
            make.right.mas_equalTo(self.bgView.mas_right).offset(-15);
            make.bottom.mas_equalTo(self.bgView.mas_bottom).offset(-25);
            make.height.mas_equalTo(tableFrame.size.height);
        }];
        [self.homePageCouponsTableView.superview layoutIfNeeded];
    }
}

 

posted @ 2018-08-04 14:27  码出境界  阅读(2988)  评论(0编辑  收藏  举报