iOS 8中具有自动高度的UITableView

时间:2015-03-18 15:51:27

标签: uitableview ios8 autolayout height

在iOS 8(以及它的SDK)之前,我使用此委托方法执行了UITableViewCell的自动高度:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    if (!_prototypeCell)
    {
        _prototypeCell = [tableView dequeueReusableCellWithIdentifier:@"MyShowIdentifier"];
    }

    EventShow *show = self.myShows[indexPath.row];

    self.prototypeCell.categoryNameLabel.text = show.event.category.name;
    self.prototypeCell.eventNameLabel.text = show.event.title;

    [self.prototypeCell layoutIfNeeded];
    CGSize size = [self.prototypeCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

    return size.height + 1.0f;
}

我的手机有两个标签,一个在另一个上面,带有自动布局限制,告诉标签垂直增长,与需要的一样多。一切都很好。

在iOS 8出现之后,我得到一个“无法同时满足约束”错误只有第一次方法systemLayoutSizeFittingSize:已执行。委托方法被调用3次。这是错误的细节:

(
    "<NSLayoutConstraint:0x7fd1e8ebce30 H:|-(5)-[UILabel:0x7fd1eb0e00a0'Cine']   (Names: '|':UITableViewCellContentView:0x7fd1eb0c0210 )>",
    "<NSLayoutConstraint:0x7fd1eb06b120 H:[UILabel:0x7fd1eb0e00a0'Cine']-(5)-|   (Names: '|':UITableViewCellContentView:0x7fd1eb0c0210 )>",
    "<NSLayoutConstraint:0x7fd1e8e7be50 'UIView-Encapsulated-Layout-Height' H:[UITableViewCellContentView:0x7fd1eb0c0210(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fd1eb06b120 H:[UILabel:0x7fd1eb0e00a0'Cine']-(5)-|   (Names: '|':UITableViewCellContentView:0x7fd1eb0c0210 )>

有一个名为“UIView-Encapsulated-Layout-Height”的新约束设置为零。我现在不知道那是什么,但我确信它应该是&gt; 0

自动高度在iOS 8中仍然有效,但它会抛出我无法解决的错误。

有什么想法吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

您获得的错误是标签宽度,因为您设置了特定宽度,并且还设置了前导和尾随约束。所以这里发生的是标签是破坏前导,尾随或宽度约束以满足标签的尾随约束。

但是为了满足你的尾随约束,它将打破宽度约束。

您需要做的只是为标签设置前导,顶部,尾部和底部约束。您还需要在这些标签之间设置垂直间距,而无需为两个标签设置高度和宽度约束。

同样在属性检查器中,您设置lines = 0,Line Breaks = Word Wrap。

您还需要在viewDidLoad中设置“self.tableView.rowHeight = UITableViewAutomaticDimension;”。