文章概要:
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]; } }