如果说你已经把在Storyboard或者XIB设置限制玩溜了,这次主要是针对UITabelViewCell来动态计算高度。
首先来讲iOS8,因为从iOS8开始引入了UITableViewCell的高度的自适应功能,在iOS8之前实现很麻烦的功能,iOS8以后就不需要自己动手去做了。
一、iOS8
if (SYSTEM_VERSION >= 8) {
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 70.0;
}
或者实现
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 66;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// TODO:自适应
if (SYSTEM_VERSION >= 8) {
return UITableViewAutomaticDimension;
}
}
在iOS8中,可以通过预估值的高度自动让Cell达到自适应。
二、iOS7
UITableViewCell的contentView的高度自适应是iOS8中加入的,iOS7就只能自己计算了。
1.声明一个property
@property (nonatomic, strong) ParentZoneWikiOnlyTopicCell *compOnlyTopicCell;
2.将这个计算cell注册
self.compOnlyTopicCell = [self.tableView dequeueReusableCellWithIdentifier:@"parentZoneWikiOnlyTopicCell"];
3.重写heightForRowAtIndexPath方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// TODO:自适应
if (SYSTEM_VERSION >= 8) {
return UITableViewAutomaticDimension;
}
if (indexPath.row == 0) {
// TODO:update 内容
self.compOnlyTopicCell.topicTitle.text = @"宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。宝宝哭闹是一种正常现象,他们也必须要哭。即使是身体完全健康的新生儿每天哭闹的时间也会有1~3个小时。";
[self.compOnlyTopicCell setNeedsUpdateConstraints];
[self.compOnlyTopicCell updateConstraintsIfNeeded];
CGRect frame = self.compOnlyTopicCell.frame;
frame.size.width = tableView.bounds.size.width;
self.compOnlyTopicCell.frame = frame;
[self.compOnlyTopicCell setNeedsLayout];
[self.compOnlyTopicCell layoutIfNeeded];
CGFloat height = [self.compOnlyTopicCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
return height + 1;
}
return 66;
}
讲解一下:
1.动态计算Cell的高度,我们是通过compOnlyTopicCell计算出高度后,在给显示在TableView上的Cell赋一个高度。
2.更新限制:setNeedsUpdateConstraints updateConstraintsIfNeeded
3.重新布局:setNeedsLayout setNeedsLayout
4.根据View自适应大小:systemLayoutSizeFittingSize 注意:+1 的原因因为0.5像素的分割线导致的。
如果说在此基础上仍然没有达到适配iOS7,通常就一种情况:多个控件之间有相对关系,或者限制变化或者需要刷新视图中的某几个因素在里面。
在cellForRowAtIndexPath中cell更新一下限制
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
基本上都能完成适配。
如果说涉及到Label多行显示的时候,最容易出现自适应问题,如果说以上办法没有实现。提供了以下几种办法:
可以尝试创建一个AutoLabel继承与UILabel,重写setBounds方法,之后替换Cell中出现的Label
-(void)setBounds:(CGRect)bounds
{
[super setBounds:bounds];
self.preferredMaxLayoutWidth = self.bounds.size.width;
}
2.可以重写Cell的layoutSubViews
- (void)layoutSubviews
{
self.topicTitle.preferredMaxLayoutWidth = self.frame.size.width - 101;
[super layoutSubviews];
}
附:Table View Cell Dynamic Height With AutoLayout for iOS 7 later
http://imnotyourson.com/table-view-cell-dynamic-height-with-autolayout-for-ios-7-later/