使用 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
这里我假设containerView
是label
和icon
的父视图,并且它已经被放入视图层次结构并布局(此时我们必须知道containerView.bounds
)。
【讨论】:
谢谢!我希望有一些纯粹的 AutoLayout 解决方案,因为在处理可变大小的容器 + 属性文本时代码会变得有点复杂。但归根结底,这是我发现唯一可行的解决方案。以上是关于使用 AutoLayout 将 UIView 调整为离散值的主要内容,如果未能解决你的问题,请参考以下文章
使用 AutoLayout 调整 UICollectionViewCell 及其内容的大小
如何使用 Autolayout 调整我的超级视图大小以匹配其子视图的大小?
如何使用 Autolayout 调整 UITableView 的大小?