Autolayout自适应(二)

原创
2015/07/03 08:33
阅读数 429

如果说你已经把在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多行显示的时候,最容易出现自适应问题,如果说以上办法没有实现。提供了以下几种办法:

  1. 可以尝试创建一个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/


展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部