tableview:heightForRowAtIndexPath:使用AutoLayout报告内容视图的大小不正确

时间:2013-10-14 02:59:08

标签: uitableview ios7 autolayout

我有一个UITableViewCell,其中包含使用AutoLayout的自定义标签。它的约束是通过内容视图的常量前导,尾随,底部和顶部空间设置的。这些单元格出现的表视图控制器位于UISplitViewController内。加载表视图时,我使用以下代码计算单元格的高度:

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
CGFloat height = size.height;

在肖像画中,这可以让我正确显示单元格。以下是部分单元格的屏幕截图:

enter image description here

但是,当我将iPad旋转到横向时,它不会计算正确的尺寸并最终填充太多:

enter image description here

在旋转内容视图的大小时调用tableview:heightForRowAtIndexPath:时设置断点未正确报告。事实上,它报告了表视图的旧的,更窄的大小。

如何在iPad上使用UISplitViewController让我的单元格正确调整大小?

1 个答案:

答案 0 :(得分:3)

UILabel#preferredMaxLayoutWidth影响systemLayoutSizeFittingSize。 例如。您可以将UILabel放在View with Interface Builder上。

Label Layout

  • superview的宽度为320px。
  • UILabel的水平空间限制为20px。

在这种情况下,UILabel#preferredMaxLayoutWidth将设置为280px。即使superview的frame.width是480px,systemLayoutSizeFittingSize也会返回不超过320px的宽度。

其中一个解决方案是覆盖CustomCell#setFrame方法。

- (void)setFrame:(CGRect)frame {  
     [super setFrame:frame];  
     _label.preferredMaxLayoutWidth = frame.size.width - 20*2 /*Horizontal Spacing*/;   
}

然后在更新label.text时需要更新布局。

_customCell.label.text = @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
[_customCell setNeedsLayout];
[_customCell layoutIfNeeded];