以编程方式设置约束优先级

Posted

技术标签:

【中文标题】以编程方式设置约束优先级【英文标题】:Programmatically set constraint priority 【发布时间】:2019-05-24 14:20:45 【问题描述】:

我需要以编程方式重新创建基于 .xib 的布局。

我在很大程度上能够实现这一点,但是无法设置我的一个锚点的优先级。

我试图在代码中重现的设置是:

我以为我可以使用setContentHuggingPriority(.init(999), for: .vertical) 设置它,但这没有效果。

如何在代码中定位此属性?

【问题讨论】:

抱歉,您的视图和布局是程序化的,还是两者兼而有之? 它是程序化的,包含一个 .xib 文件,已要求我们在项目中不使用 xib,因此我正在代码中重新创建 xibbed 布局。 Set priority on constraints in swift的可能重复 【参考方案1】:

您应该使用低于 1000 的优先级,因此 999 将是完美的。

let constraint = firstView.widthAnchor.constraint(equalTo: secondView.widthAnchor)
constraint.priority = UILayoutPriority(999)
constraint.isActive = true

更新

你也可以使用defaultLow而不是指定原始值

constraint.priority = .defaultLow

【讨论】:

建议UILayoutPriority(999) 不是更好吗,因为这是问题的优先级? 我在 dup 问题中的回答被接受已经 6 个月了,所以我在这里可能错了 - 但我的记忆告诉我 UILayoutPriority(999) 不再起作用了。它必须是UILayoutPriority(rawValue: 999)。再说一次,我可能是错的。 @dfd 两个初始化器似乎都存在。 init(_ rawValue: Float)init(rawValue: Float).【参考方案2】:

我知道现在已经很晚了,但是如果它对某人有帮助的话。因此,如果您想优先玩,您将需要 2 个约束。

private var _constraintToManageHQ:NSLayoutConstraint?
_constraintToManageHQ = _viewHBar1.topAnchor.constraint(equalTo: _lblAddress.bottomAnchor, constant: 14.0)
_constraintToManageHQ!.isActive = true
_constraintToManageHQ!.priority = UILayoutPriority(rawValue: 995)

具有默认 1000 优先级的其他约束

_viewHBar1.topAnchor.constraint(equalTo: _containerHeadQuater.bottomAnchor, constant: 14.0).isActive = true

还有一次 _containerHeadQuater.removeFromSuperview() 已从 superview 中删除,您的具有较低优先级的 _constraintToManageHQ 将启动并保持 UI 稳定。

【讨论】:

以上是关于以编程方式设置约束优先级的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout约束以适应矩形内的视图,保持一定的纵横比(以编程方式)

如何解决:无法同时满足约束

什么是“实时”进程优先级设置?

iOS 通过设定约束优先级来改变 Layout 时的动画.

Masonry设置约束优先级[转]

如何以编程方式找出打开了哪种位置模式?