使用自动布局将 UIView 大小调整为离散值



简短的版本是这样的:如果有足够的空间,我需要我的UIView宽度为50,如果没有,则需要0。我该怎么做?


现在是长版本:

我有一个带有图标后跟标签的 UIView,理想情况下视图始终看起来像|-icon-label-|

然而,有时标签太长,必须给出一些东西。我不需要调整大小/截断文本或调整图标大小,而是需要图标完全消失(例如将其大小设置为零)。

我希望我能通过以下方式实现这一目标:

  1. 将图标的水平抗压性设置为低于标准值(例如 700)
  2. 在图标的宽度约束上设置可选的高优先级(例如宽度 = 50,优先级 = 900)
  3. 在图标的宽度约束上设置较低的优先级(宽度=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
}

在这里,我假设containerViewlabelicon的超级视图,并且它已经被置于视图层次结构中并进行了布局(此时我们必须知道containerView.bounds)。

最新更新