使用 AutoLayout 将 UIView 调整为离散值

Posted

技术标签:

【中文标题】使用 AutoLayout 将 UIView 调整为离散值【英文标题】:Size a UIView to discrete values using AutoLayout 【发布时间】:2018-02-02 06:57:41 【问题描述】:

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


现在是长版:

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

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

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

    将图标的水平压缩阻力设置为低于标准的值(例如 700) 在图标的宽度限制上设置可选的高优先级(例如 width=50,priority=900) 在图标的宽度限制上设置较低的优先级(宽度=0,优先级=800)

通过这种设置,我希望约束 #2 会随着标签变长而中断,而约束 #3 将用作合适的后备。然而,这显然不是自动布局的工作方式:图标视图只是稍微调整大小(缩小),但并没有完全消失。换句话说。约束 #3 被忽略。

必须有一个合理的方法来做到这一点?我错过了什么?

【问题讨论】:

【参考方案1】:

长话短说:您必须根据标签的宽度以编程方式更改自动布局的宽度。

更长一点的版本:

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)。

【讨论】:

谢谢!我希望有一些纯粹的 AutoLayout 解决方案,因为在处理可变大小的容器 + 属性文本时代码会变得有点复杂。但归根结底,这是我发现唯一可行的解​​决方案。

以上是关于使用 AutoLayout 将 UIView 调整为离散值的主要内容,如果未能解决你的问题,请参考以下文章

iOS Autolayout 调整标签大小和它们之间的空间

使用 AutoLayout 调整 UICollectionViewCell 及其内容的大小

如何使用 Autolayout 调整我的超级视图大小以匹配其子视图的大小?

如何使用 Autolayout 调整 UITableView 的大小?

从 Nib 加载的 UIView,手动调用 autolayout

Autolayout 将 UIView 放在边距和另一个 UIView 之间