iOS 自动布局忽略 "trailing space"约束,而是使用宽度/内容大小?

标签 ios iphone xcode autolayout xcode7

我有一个 UILabel(副标题),我希望它有一个静态 X 原点,但延伸到它最近邻居的边缘。如果不需要,有一个按钮(“访问链接”)可以在运行时选择性地从 super View 中删除。从标签到按钮的约束优先级为1000,从标签到superview容器的约束优先级为250:

enter image description here

但是,当我运行删除按钮的应用程序时(通过 viewDidLoad 方法中的 .removeFromSuperview()),通过 View 调试我看到内容大小是设置标签的宽度,优先于我设置的约束。

期望标签延伸到 View 的边缘,但如您所见,约束是灰色的——我假设被(content size) 改为约束:

enter image description here

(content size) 约束是否比我的 Trailing Space to: Superview 约束具有更高的优先级?我该如何更改它,因为它不是我定义的约束?

最佳答案

当您从 View 层次结构中删除按钮时,也会删除涉及该按钮的任何约束。因此,剩下的就是优先级为 250 的父 View 的尾随约束。

标签具有基于其内容的固有宽度。这意味着它的水平内容拥抱和抗压缩优先级开始发挥作用。它的内容拥抱优先级是 251。

这意味着对于自动布局系统来说, View 的宽度不超过必要的宽度比保持其后缘与父 View 的后缘相距 8 点更为重要。

您可能应该增加尾随约束的优先级。您希望它小于按钮的尾随约束,以便在存在按钮的情况下不会发生冲突。您还希望它低于按钮的压缩阻力优先级,以便按钮不会被压扁以允许标签距 super View 8 点。但是,除此之外,您希望它尽可能高。 (在假设的情况下,您只是简单地摆脱了存在按钮的可能性,您通常会要求该尾随约束,对吧?因此,它应该尽可能接近要求,而不会造成不良副作用。)

如果您的目标是部署到 iOS 9.0 或更高版本,您应该考虑为此布局使用 UIStackView。它会为您处理一些事情,例如在隐藏或显示按钮时添加或删除适当的约束。

关于iOS 自动布局忽略 "trailing space"约束,而是使用宽度/内容大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33856119/

相关文章:

ios - 尝试保存元数据 - HealthKit

iOS:对 iCarousel 中未选择 View 的约束

iphone - 在 UIWebView 中打开 RTFD 文件

ios - UITextView selectionRange具有加号“+”的奇怪行为

iphone - 应用程序未安装...因为其资源已被修改

javascript - 使用 JavaScript/HTML 防止手机在移动网络浏览器中休眠的技巧?

ios - 为什么不写optional mark就可以声明一个变量?

iphone - iOS 中的 StoreKit - 自动续订订阅 - 如何知道它是否是免费试用版?

ios - 在 Swift 中将 Bool 从一个类返回到另一个类

ios - 导入 AudioKit 框架给出 "' x' is not a member type of 'AudioKit' 错误