UITableViewCell的contentView变得不受欢迎" height == 44"约束

时间:2014-09-29 12:34:17

标签: ios uitableview autolayout

我完全在代码中创建我的UI,并使用Masonry将单元格的内容视图的子视图约束到适当的高度。我正在使用

[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height

在iOS 7上的行高,而iOS 8自动处理它。

所有内容看起来都应该在屏幕上显示,但在控制台中,我会收到大量警告以解决相互冲突的约束,这些约束似乎都是由于单元格内容视图上的未经处理和不必要的高度限制引起的(例如<NSLayoutConstraint UITableViewCellContentView.height == 44> )。

在iOS 8上我将表格视图的rowHeight设置为UITableViewAutomaticDimension(有效-1),但我仍然受到此限制。我只在内容视图和它自己的子视图之间添加约束,因此内容视图和单元格本身之间没有约束。

知道这种约束来自何处以及如何使其消失?

编辑:现在我实际上找到了各种各样的“解决方案” - 在添加子视图或约束之前,最初将内容视图的框架设置为荒谬的,如CGRectMake(0, 0, 99999, 99999),似乎使警告消失了。但这并不是正确的方式,所以有人能说出更好的方法吗?

5 个答案:

答案 0 :(得分:17)

我遇到了同样的问题并修复了它设置单元格的自动调整大小掩码:

override func awakeFromNib() {
    super.awakeFromNib()
    self.contentView.autoresizingMask = .flexibleHeight
}

同样在控制器中我设置估计高度并告诉表视图使用自动尺寸(在viewDidLoad方法中:

    self.tableView.estimatedRowHeight = 120
    self.tableView.rowHeight = UITableView.automaticDimension

这些链接有助于:

http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html

Auto layout constraints issue on iOS7 in UITableViewCell

希望这有帮助!

答案 1 :(得分:6)

为了达到接受的答案 - 经过几个月试图让iOS 8的自动细胞大小调整起作用后,我发现了一个重要的警告。必须设置'estimatedRowHeight'属性。通过tableView直接或通过实现委托方法。即使无法确定有效估计值,只需提供默认值(0.0)以外的值就可以证明iOS 8的单元格布局可以在我的测试中使用。

答案 2 :(得分:5)

关于&#34;解决方案&#34;在问题的编辑中提到(暂时将contentView框架设置为大的东西),这里的证明这是一个很好的解决方案&#34;: https://github.com/smileyborg/TableViewCellWithAutoLayoutiOS8/blob/master/TableViewCellWithAutoLayout/TableViewController/TableViewCell.swift

        // Note: if the constraints you add below require a larger cell size than the current size (which is likely to be the default size {320, 44}), you'll get an exception.
        // As a fix, you can temporarily increase the size of the cell's contentView so that this does not occur using code similar to the line below.
        //      See here for further discussion: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
        // contentView.bounds = CGRect(x: 0.0, y: 0.0, width: 99999.0, height: 99999.0)

它的hacky但似乎有用。

答案 3 :(得分:0)

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {

        //self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
        self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
        self.itemView = [CustomItemView new];
        [self.contentView addSubview:self.itemView];

    }

    return self;
}

translatesAutoresizingMaskIntoConstraints设置为NO对我不起作用 ,但autoresizingMask = UIViewAutoresizingFlexibleHeight很好。

您还应该制定这样的约束:

- (void)updateConstraints {

    [self.itemView mas_updateConstraints:^(MASConstraintMaker *make) {

        make.leading.trailing.top.equalTo(0);
        //make.bottom.equalTo(0);
        make.bottom.lessThanOrEqualTo(0);

    }];

    [super updateConstraints];
}

底部约束不只是equalTo contentView的底部,你应该使用lessThanOrEqualTo

希望这对你有用!

答案 4 :(得分:0)

我发现在某些情况下,设置一个比我的平均细胞高很多倍的估计高度,即使不是所有警告都会修复,并且对显示屏没有负面影响。

即: 设置 self.tableView.estimatedRowHeight = 500.0f ,而大多数行的高度只有100.0f左右,修复了我的问题。