如何删除UITableView' s NSAutoresizingMaskLayoutLayoutConstraint?

时间:2014-05-09 06:06:51

标签: ios objective-c uitableview autolayout

我通过在单元格的contentView中添加一些子视图来设计自定义UITableViewCell,我还在contentView和子视图之间添加了一些自动布局约束。

但是当我调试应用程序时,Xcode告诉我存在约束冲突。在约束列表中,有一个NSAutoresizingMaskLayoutLayoutConstraint将单元格高度限制为43,因此Xcode打破了我的子视图高度的约束,并且压缩了#c;它

我试过了:

  1. 在“界面”构建器中,取消选中"自动调整子视图"复选框。不行。

  2. 在代码cell.contentView.translatesAutoResizingMaskIntoConstraints = NO中。这会导致应用程序崩溃并出现异常:"执行-layoutSubviews"后仍需要自动布局。我在这个问题中尝试了所有提议的解决方案:"Auto Layout still required after executing -layoutSubviews" with UITableViewCell subclass它们都不适用于我。

  3. 所以我想我只能让单元格进行自动调整,并删除代码中的自动调整大小约束。如何在不破坏事情的情况下做到这一点?

    编辑: 或者,从另一个角度来看,我如何使tableViewCell高度灵活(随子视图高度和约束而变化)?在IB中,我必须设置它的高度,对吗?

2 个答案:

答案 0 :(得分:1)

您不需要设置cell.contentView.translatesAutoResizingMaskIntoConstraints = NO

为了在autolayout中获得UITableViewCells中的灵活高度,您需要手动计算- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

中的高度

是的,这很乏味,但没有别的办法。要自动计算高度,您需要在UITableViewCell中满足两个条件:

  1. 您必须确保所有子视图都有 translatesAutoResizingMaskIntoConstraints=NO
  2. 您的单元子视图的约束必须推动UITableViewCell的顶部和底部边缘。
  3. 然后在- (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)

我使用自动布局为动态tableview单元格高度创建了一些示例代码。您可以使用以下链接下载项目。

DynamicTableViewCellHeight

我希望这会对你有所帮助。