AutoLayout 的 systemLayoutSizeFittingSize 只适用于 UILabel?

Posted

技术标签:

【中文标题】AutoLayout 的 systemLayoutSizeFittingSize 只适用于 UILabel?【英文标题】:AutoLayout's systemLayoutSizeFittingSize works only with UILabels? 【发布时间】:2016-05-30 07:32:51 【问题描述】:

我只需要使用systemLayoutSizeFittingSize:UILayoutFittingCompressedSize 方法制作一个具有自动高度计算功能的 UITableViewCell。在我的视图有 UILabels 和 UIImageViews 之前,一切都很好。当我需要用 UIButton 替换其中一个标签时,该方法没有正确计算大小。

我们是否需要向 UIElements 提供一些额外的信息而不是 UILabels 才能正常工作?

最后,我不得不将 TapGestures 添加到 UILabels 以使其工作。

这是单元格视图:

时间“09:00 AM”和位置是这里的标签,如果方法正确给出结果,这些可能是按钮。

这个想法很简单,创建一个屏幕尺寸尽可能小的单元 xib(iPhone 3.5 英寸)。在您的类中单独创建一个 xib 实例,为该实例提供信息(时间、位置等)并运行 systemLayoutSizeFittingSize:UILayoutFittingCompressedSize 方法来计算大小。

_scheduleCell = [[[UINib nibWithNibName:@"HomeScheduleViewCell" bundle:nil] instantiateWithOwner:nil options:nil] objectAtIndex:0];

 CGSize fullSize = [_scheduleCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

【问题讨论】:

【参考方案1】:

如果您使用自动布局,那么您应该使用UITableViewAutomaticDimension。它会根据内容自动计算您的行高,但它必须需要 autolayoot 并正确设置约束。

正如Apple documentation 所说,

要定义单元格的高度,您需要一个完整的约束链和视图(具有定义的高度)来填充内容视图的顶部边缘和底部边缘之间的区域。如果您的视图具有内在的内容高度,系统将使用这些值。如果没有,您必须向视图或内容视图本身添加适当的高度约束。

你可以像这样使用它,

tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableViewAutomaticDimension

这样你就可以用按钮代替标签或任何对象了。

主要是管理自动布局。它应该是完整的约束链,这意味着第一个对象必须具有顶部约束,而最后一个对象必须在单元格的内容视图中具有底部约束。

希望这会有所帮助:)

【讨论】:

感谢您的回答。但它是否记录在某处,systemLayoutSizeFittingSize:UILayoutFittingCompressedSize 不包括 UIButton 而只包括 UILabel。因为,两种方法的代码/时间量是相同的。完整的约束链对它们都是相同的。 不,没有像 systemLayoutSizeFittingSize:UILayoutFittingCompressedSize 这样的文档不包括 UIButton!我认为你在给出约束时一定犯了一些错误

以上是关于AutoLayout 的 systemLayoutSizeFittingSize 只适用于 UILabel?的主要内容,如果未能解决你的问题,请参考以下文章

代码适配(Autolayout)

AutoLayout

什么是Autolayout

自动布局AutoLayout

Autolayout第三方库Masonry的入门与实践

Autolayout约束动画化-Animating Autolayout Constraints