相对约束的自动布局不影响systemLayoutSizeFittingSize:用于UITableViewCell

我有一个UITableViewdynamic高度UITableViewCell s和我正在使用自动布局计算高度作为这个主题的优秀答案 。 到现在为止还挺好。

我正在调整应用程序以适应更大的iPhone(6和6 Plus)屏幕尺寸,而且它大多非常简单。

然而,在我的一些单元格中,我有一个图像,我想跨越单元格的整个宽度,我希望图像的高度与图像的宽度成比例(0.55 *宽度,具体)。 到目前为止,我已经在自动布局约束下,根据标准的320px纵向桌面视图宽度iPhone 6/6 Plus,硬编码了图像的宽度和高度。

我认为这会很简单,像这样(我使用PureLayout )添加一个相对高度约束:

 [self.myImage autoMatchDimension:ALDimensionHeight toDimension:ALDimensionWidth ofView:self withMultiplier:0.55f relation:NSLayoutRelationGreaterThanOrEqual]; 

如果您不熟悉PureLayout,则转换为致电

[NSLayoutConstraint constraintWithItem: attribute: relatedBy: toItem: attribute: multiplier: constant:0.0f]

还有其他的约束,把它的边缘连接到superview,这是UITableViewCell contentView。

但是,当我调用systemLayoutSizeFittingSize:单元格的contentView时,它似乎完全忽略了相对高度约束,并且结果单元格高度太小systemLayoutSizeFittingSize:适合图像。

如果我设置了一个明确的高度约束而不是相对的约束,那就没有问题了。 同样,如果我UIImageView并在intrinsicContentSize返回一个显式的大小,没有问题。

我甚至在我的UIImageView子类中尝试了以下内容:

 - (void) layoutSubviews { [super layoutSubviews]; self.intrinsicSizeForAutolayout = self.frame.size; [super layoutSubviews]; } - (CGSize)intrinsicContentSize { return self.intrinsicSizeForAutolayout; } 

其中intrinsicSizeForAutolayout是我为此目的定义的属性。 我认为这可能类似于为UILabel设置preferredMaxLayoutWidth解决类似问题的方式。

但不是。 它不起作用。

看起来,我没有其他办法可以使用丑陋的屏幕宽度检查代码来根据屏幕宽度有条件地设置一个固定的高度限制,这是我真正想要避免的,因为这样做首先会破坏使用自动布局的目的。

单元格contentView的宽度默认没有任何限制(只有当它被添加到表视图时,它的宽度才由SDK设置),所以当你调用systemLayoutSizeFittingSize:时,约束求解器假定它是有效的压缩当试图find一个有效的解决scheme,这当然会导致错误的高度所需的宽度。

为了解决这个问题,你可以添加一个约束到contentView ,它的宽度被修改为最终的单元格/表格视图宽度。 这是有效的,因为这个约束被考虑到单元格大小布局传递,并导致systemLayoutSizeFittingSize:按预期工作。

使用PureLayout ,我build议做一些事情:

 [UIView autoSetPriority:UILayoutPriorityRequired - 1 forConstraints:^{ [cell.contentView autoSetDimension:ALDimensionWidth toSize:CGRectGetWidth(tableView.bounds)]; }]; 

请注意,为约束设置小于Required的优先级并不是一个坏主意,因为这仅仅是为了帮助resize操作,并且如果这种情况被破坏,您不希望发生exception(可能是由于将来的SDK更改表格视图单元格如何工作)。 但是这可能没有关系。

此外,像往常一样,你可能想要确保这个约束只添加一次(不是每次调用tableView:heightForRowAtIndexPath: – 这应该很容易做到。

看到这里为您的示例项目的叉特定的解决scheme: https : //gist.github.com/smileyborg/0a2082a4d26fcc7fde4d