使用 AutoLayout 将 UIView 调整为离散值
Size a UIView to discrete values using AutoLayout
简短的版本是这样的:如果有足够的空间,我需要我的 UIView 的宽度为 50,如果没有,则为 0。 我该怎么做这个?
现在是长版:
我有一个 UIView,它有一个图标后跟一个标签,理想情况下视图总是看起来像 |-icon-label-|
不过有时标签太长,有些东西不得不放弃。我不需要调整/截断文本或调整图标大小,而是需要图标完全消失(例如将其大小设置为零)。
我希望我可以通过以下方式实现这一目标:
- 将图标的水平压缩阻力设置为低于标准的值(比如 700)
- 在图标的宽度约束上设置可选的高优先级(比如宽度=50,优先级=900)
- 为图标的宽度限制设置较低的优先级(宽度=0,优先级=800)
通过此设置,我希望约束 #2 会随着标签变长而中断,而约束 #3 将用作合适的回退。然而,这显然不是自动布局的工作方式:图标视图只是稍微调整(缩小)了一点,但并没有完全消失。换句话说。约束 #3 被简单地忽略了。
必须有一个合理的方法来做到这一点?我错过了什么?
长话短说:您必须根据标签的宽度以编程方式更改自动布局的宽度。
稍长一点的版本:
只对 icon
的宽度设置一个约束并保留对它的引用:
let iconWidthConstraint = icon.widthAnchor.constraint(equalToConstant: 50)
iconWidthConstraint.isActive = true
然后,当您检索文本并将其设置为标签时,您必须检测 icon
是否需要隐藏,如果需要,只需将其常量更改为零即可。所以像:
label.text = yourText
if label.intrinsicContentSize.width + 50 < containerView.bounds.width {
iconWidthConstraint.constant = 50
} else {
iconWidthConstraint.constant = 0
}
这里我假设containerView
是label
和icon
的父视图,并且它已经放入视图层次结构中并进行了布局(此时我们必须知道 containerView.bounds
).
简短的版本是这样的:如果有足够的空间,我需要我的 UIView 的宽度为 50,如果没有,则为 0。 我该怎么做这个?
现在是长版:
我有一个 UIView,它有一个图标后跟一个标签,理想情况下视图总是看起来像 |-icon-label-|
不过有时标签太长,有些东西不得不放弃。我不需要调整/截断文本或调整图标大小,而是需要图标完全消失(例如将其大小设置为零)。
我希望我可以通过以下方式实现这一目标:
- 将图标的水平压缩阻力设置为低于标准的值(比如 700)
- 在图标的宽度约束上设置可选的高优先级(比如宽度=50,优先级=900)
- 为图标的宽度限制设置较低的优先级(宽度=0,优先级=800)
通过此设置,我希望约束 #2 会随着标签变长而中断,而约束 #3 将用作合适的回退。然而,这显然不是自动布局的工作方式:图标视图只是稍微调整(缩小)了一点,但并没有完全消失。换句话说。约束 #3 被简单地忽略了。
必须有一个合理的方法来做到这一点?我错过了什么?
长话短说:您必须根据标签的宽度以编程方式更改自动布局的宽度。
稍长一点的版本:
只对 icon
的宽度设置一个约束并保留对它的引用:
let iconWidthConstraint = icon.widthAnchor.constraint(equalToConstant: 50)
iconWidthConstraint.isActive = true
然后,当您检索文本并将其设置为标签时,您必须检测 icon
是否需要隐藏,如果需要,只需将其常量更改为零即可。所以像:
label.text = yourText
if label.intrinsicContentSize.width + 50 < containerView.bounds.width {
iconWidthConstraint.constant = 50
} else {
iconWidthConstraint.constant = 0
}
这里我假设containerView
是label
和icon
的父视图,并且它已经放入视图层次结构中并进行了布局(此时我们必须知道 containerView.bounds
).