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

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


现在是长版:

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

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

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

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

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

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

【问题讨论】:

    标签: ios uiview autolayout ios-autolayout


    【解决方案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 解决方案,因为在处理可变大小的容器 + 属性文本时代码会变得有点复杂。但归根结底,这是我发现唯一可行的解​​决方案。
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 2015-08-05
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多