以编程方式设置约束优先级
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 稳定。
【讨论】:
以上是关于以编程方式设置约束优先级的主要内容,如果未能解决你的问题,请参考以下文章