我通过在单元格的contentView中添加一些子视图来设计自定义UITableViewCell,我还在contentView和子视图之间添加了一些自动布局约束。
但是当我调试应用程序时,Xcode告诉我存在约束冲突。在约束列表中,有一个NSAutoresizingMaskLayoutLayoutConstraint将单元格高度限制为43,因此Xcode打破了我的子视图高度的约束,并且压缩了#c;它
我试过了:
在“界面”构建器中,取消选中"自动调整子视图"复选框。不行。
在代码cell.contentView.translatesAutoResizingMaskIntoConstraints = NO
中。这会导致应用程序崩溃并出现异常:"执行-layoutSubviews"后仍需要自动布局。我在这个问题中尝试了所有提议的解决方案:"Auto Layout still required after executing -layoutSubviews" with UITableViewCell subclass它们都不适用于我。
所以我想我只能让单元格进行自动调整,并删除代码中的自动调整大小约束。如何在不破坏事情的情况下做到这一点?
编辑: 或者,从另一个角度来看,我如何使tableViewCell高度灵活(随子视图高度和约束而变化)?在IB中,我必须设置它的高度,对吗?
答案 0 :(得分:1)
您不需要设置cell.contentView.translatesAutoResizingMaskIntoConstraints = NO
为了在autolayout中获得UITableViewCells中的灵活高度,您需要手动计算- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
是的,这很乏味,但没有别的办法。要自动计算高度,您需要在UITableViewCell中满足两个条件:
translatesAutoResizingMaskIntoConstraints=NO
然后在- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
中,您需要为特定的indexPath重新创建该单元格,并为该单元格手动计算高度。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath
*)indexPath
{
//Configure cell subviews and constraints
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
[self configureCell:cell forIndexPath:indexPath];
//Trigger a layout pass on the cell so that it will resolve all the constraints.
[cell setNeedsLayout];
[cell layoutIfNeeded];
//Compute the correct size of the cell and get the height. This is where the magic happens.
CGFloat height = [cartItemCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
height += 1.0f
return height;
}
请注意,使用UITextViews systemLayoutSizeFittingSize
是不可思议的。在这种情况下,您必须使用另一种方式手动计算整个单元格的高度。您还可以通过缓存每个indexPath的高度来执行一些性能优化。
这篇博文有关于该怎么做的更详细的描述,但要点基本上就是我上面提到的。 :http://johnszumski.com/blog/auto-layout-for-table-view-cells-with-dynamic-heights
答案 1 :(得分:1)