上一个需求中遇到了一些自适应高度的坑(主要是label的适配),在这里分享一下自适应高度的一些心得。正好为下一个feed流的需求作准备。
tableViewCell自适应高度
设置约束时,要确保上下有一条贯通的约束线,如果是xib文件,因为视图高度是固定的,另外贯通的约束线也确定一个高度,如果两个不一样,则会报错。因此最好先把高度调整好再添加约束。
除此之外,需要添加以下代码
//高度自适应
self.tableView.rowHeight = UITableViewAutomaticDimension;
//填一个估算值
self.tableView.estimatedRowHeight = 40;
tableHeadView/FootView自适应高度
和tableViewCell一样,这两个view都得确保有一条贯通的约束线。但是,仅靠约束是不能实现高度自适应的,需要手动设置frame:
-(void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
CGRect viewRect = self.tableView.tableHeaderView.frame;
viewRect.size.height = [self.tableView.tableHeaderView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height;
self.tableView.tableHeaderView.frame = viewRect;
}
存在UILabel的情况
UILabel是可以自适应行高的,但在配合自动布局时,需要作如下配置:
self.label.preferredMaxLayoutWidth = 95;
这是因为在某些系统上自动布局在计算高度的时候无法知道label的文字排版,无法计算label的高度,从而导致整体布局的时候出现偏差(比如label被压缩),这个时候需要加上这句提供label上一行的最大宽度。
另外,如果再cell上的label作文本的展开/收起操作,在这个操作之后需要刷新该行的cell才能改变高度,如果数据源没变仅更新高度,可以用[self.tableView beginUpdates]
/[self.tableView endUpdates]
进行刷新。
网友评论