如何使用自动布局定义最大宽度约束?

Posted

技术标签:

【中文标题】如何使用自动布局定义最大宽度约束?【英文标题】:How to define maximum width constraint with Auto-Layout? 【发布时间】:2016-09-17 22:32:10 【问题描述】:

使用自动布局将UIImageView 添加到UITableViewCell

UIImageView 的宽度应该是UITableViewCell 宽度的 50%,但无论如何不能大于 50px。

这不起作用:

    NSLayoutConstraint.activate([
        cellImageView.topAnchor.constraint(equalTo: contentView.topAnchor),
        cellImageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
        cellImageView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor),
        cellImageView.heightAnchor.constraint(equalTo: cellImageView.widthAnchor, multiplier: cellImage.size.height / cellImage.size.width),
        cellImageView.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 0.5),
        cellImageView.widthAnchor.constraint(lessThanOrEqualToConstant: 50)
        ])

如何定义布局约束?

【问题讨论】:

【参考方案1】:

这是一个布局库吗?我不熟悉您代码中的语法,但根据您的描述,听起来您想要的宽度限制是:

lessThanOrEqualToConstant: 50 equalTo: contentView.widthAnchor, multiplier: 0.5 的优先级低于 50pt 约束

【讨论】:

如果图像宽度应该是单元格宽度的 50% 或最大 50px,为什么会是 greaterThanOrEqualTo?语法是 Swift 3。 啊,你的编辑刚刚扭转了这一点。我将编辑我的答案。关键部分是第二个约束的优先级较低。 对不起,我的描述可能不够清楚,我的意思是最大 50% 或更小。更新了帖子:) 没问题。如果设置较低的优先级可以解决问题,请告诉我。 谢谢,它通过将 50% 约束设置为 999 来工作。【参考方案2】:

您将设置两个具有不同优先级的单独约束。一个约束是具有UILayoutPriority.DefaultHigh 优先级的50% 宽度(例如750),而第二个约束是具有UILayoutPriority.Required 优先级的50 point 约束(例如1000)。然后,这将尝试满足这两个约束,但如果它们发生冲突(即超过 50 分),则会打破 50% 的约束。

【讨论】:

我很困惑,你在上面说了一些不同的话(“它通过将 50% 约束设置为 999 来工作”)。这个评论也有点令人困惑,因为这会推断出 50% 比 50pt 约束更强。这将使视图保持在 50%,因为这是最强的约束。 对不起,这里是更正的评论:“这不起作用,因为当我为 50% 约束设置 UILayoutPriority.DefaultHigh 时,即使没有激活 50pt 约束,它也根本不会生效。解决方案是保留 50pt 约束的优先级(默认为 1000)并将 50% 的优先级设置为 999。”所以你的解决方案几乎奏效了:) 啊,这更有意义。感谢您的澄清。是的,有时high 是不够的,考虑到其他 [有时更隐藏的] 主动约束(例如拥抱/伸展)。很高兴999 工作!

以上是关于如何使用自动布局定义最大宽度约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局“项目格式约束”为 UIViews 设置相等的宽度

如何对 UIView 上的自动布局约束引起的大小变化做出反应?

如何在ios swift中以编程方式创建自动布局等宽度约束?

使用自动布局约束以编程方式创建四个具有相同高度和宽度的 UIView

如何使用固定宽度和自动布局正确缩放图像?

是否可以定义相对于未知 UIViews 的自动布局约束?