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

Way*_*man 7 uitableview autolayout ios7

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

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
CGFloat height = size.height;
Run Code Online (Sandbox Code Playgroud)

在肖像中,这允许我正确显示单元格.以下是部分单元格的屏幕截图:

在此输入图像描述

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

在此输入图像描述

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

如何让我的细胞UISplitViewController在iPad上适当调整大小?

EIM*_*MEI 3

UILabel#preferredMaxLayoutWidth 影响 systemLayoutSizeFittingSize。例如。您可以使用 Interface Builder 将 UILabel 放置在视图上。

标签布局

  • 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*/;   
}
Run Code Online (Sandbox Code Playgroud)

然后当你更新label.text的时候你需要更新布局。

_customCell.label.text = @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
[_customCell setNeedsLayout];
[_customCell layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)