Xcode 6 - iOS8 - Auto Layout 如何正确设置约束优先级
Xcode 6 - iOS8 - Auto Layout how to set constraint priorities right
我正在尝试使用自动布局来动态调整 UITableViewCell 的高度。对于基本的单元格设计,比如行中的标签,我已经设法实现了我想要的。但我无法让它为以下工作:
设置
- 我正在使用 Swift 和 Xcode 6.4 目标 iOS8 及更高版本。
- TableView 行高设置为 UITableViewAutomaticDimension。
- TableView 的估计高度设置为 100,这通常应该接近最终高度。
- 标题的垂直拥抱优先级设置为低 (250)。
- 没有改变其他元素的拥抱和压缩优先级。
这是原型单元格:
左边的图片有固定的高度。标题文本应该增长以适应完整的文本。这是一个行设置为 0 的标签。副标题不应增长,因为它只会是短文本。
我的约束设置
- 对于图像前导和顶部约束设置为 18。标题和副标题标签的尾部约束设置为 18。底部约束设置为 18,优先级低 (249)。
- 对于标题标签顶部和尾部约束到超级视图设置为 18。前导约束到图像 18。底部约束到副标题是 0。
- 对于字幕标签,标题标签的顶部约束为 0。尾随 space 到超级视图的约束为 18。图像的前导约束为 18。超级视图的底部约束为 18,优先级低 (250)。
问题
无论如何,我希望超级视图的底部 space 为 18 个单位。这意味着,如果文本的(标题 + 副标题)高度小于图像的高度。图像的底部约束应确保 18 个单位的底部边距。如果标题变高,文字总高度高于图片,则字幕的底部约束应保证18 unity bottom margin,忽略图片的底部约束。
感谢您提出解决此问题的任何建议,因为我现在只是在约束中输入一些随机值...
更新
请参阅标记的答案,了解如何设置约束以实现我需要的布局。如果您的单元格在 tableview 的第一次加载时布局不正确,请解决这个问题:
首先,尽管 UITableViewAutomaticDimension 的名称没有记录自动 TableView 行高。只是不要实施 heightForRowAtIndexPath
并像您那样实施 estimatedheightForRowAtIndexPath
。
解决布局问题,不是优先级问题,而是你的约束问题。因为您的图像有固定的顶部和底部约束,所以单元格永远不会增长到大于图像 + 36pt。解决方案是使图像的顶部和底部约束 >= 而不是 =。
这样做之后,你可能会发现IB中对于不明确的约束有红色警告。这是因为大于或等于约束,布局无法确定图像视图的正确 Y 位置。解决方法:给imageView添加一个center Y in superview constraint。
我正在尝试使用自动布局来动态调整 UITableViewCell 的高度。对于基本的单元格设计,比如行中的标签,我已经设法实现了我想要的。但我无法让它为以下工作:
设置
- 我正在使用 Swift 和 Xcode 6.4 目标 iOS8 及更高版本。
- TableView 行高设置为 UITableViewAutomaticDimension。
- TableView 的估计高度设置为 100,这通常应该接近最终高度。
- 标题的垂直拥抱优先级设置为低 (250)。
- 没有改变其他元素的拥抱和压缩优先级。
这是原型单元格:
左边的图片有固定的高度。标题文本应该增长以适应完整的文本。这是一个行设置为 0 的标签。副标题不应增长,因为它只会是短文本。
我的约束设置
- 对于图像前导和顶部约束设置为 18。标题和副标题标签的尾部约束设置为 18。底部约束设置为 18,优先级低 (249)。
- 对于标题标签顶部和尾部约束到超级视图设置为 18。前导约束到图像 18。底部约束到副标题是 0。
- 对于字幕标签,标题标签的顶部约束为 0。尾随 space 到超级视图的约束为 18。图像的前导约束为 18。超级视图的底部约束为 18,优先级低 (250)。
问题
无论如何,我希望超级视图的底部 space 为 18 个单位。这意味着,如果文本的(标题 + 副标题)高度小于图像的高度。图像的底部约束应确保 18 个单位的底部边距。如果标题变高,文字总高度高于图片,则字幕的底部约束应保证18 unity bottom margin,忽略图片的底部约束。
感谢您提出解决此问题的任何建议,因为我现在只是在约束中输入一些随机值...
更新
请参阅标记的答案,了解如何设置约束以实现我需要的布局。如果您的单元格在 tableview 的第一次加载时布局不正确,请解决这个问题:
首先,尽管 UITableViewAutomaticDimension 的名称没有记录自动 TableView 行高。只是不要实施 heightForRowAtIndexPath
并像您那样实施 estimatedheightForRowAtIndexPath
。
解决布局问题,不是优先级问题,而是你的约束问题。因为您的图像有固定的顶部和底部约束,所以单元格永远不会增长到大于图像 + 36pt。解决方案是使图像的顶部和底部约束 >= 而不是 =。
这样做之后,你可能会发现IB中对于不明确的约束有红色警告。这是因为大于或等于约束,布局无法确定图像视图的正确 Y 位置。解决方法:给imageView添加一个center Y in superview constraint。