如何使用自动布局定义最大宽度约束?
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中以编程方式创建自动布局等宽度约束?