如文件所述:
优先级不能从非必需变为必需,也不能从必需变为非必需。
然而,当我试图这样做的时候,我成功了。下面是我的示例代码:
var centerConstraint: UILayoutConstraint!
var topConstraint: UILayoutConstraint!
signInButton = UIButton(type: .system)
// Some setting code
...
signUpView = UIView()
// Some setting code
...
signInView.addSubview(signInButton)
centerConstraint = signInButton.centerXAnchor.constraint(equalTo: signInView.centerXAnchor)
centerConstraint.isActive = true
topConstraint = signInButton.centerXAnchor.constraint(equalTo: signInView.leadingAnchor)
topConstraint.priority = .defaultHigh
topConstraint.isActive = true
我创建了一个SigninButton
和一个SigninView
。SigninButton
有两个约束。一个优先级为.required
(默认),另一个优先级为.defaulthigh
。
然后,当用户单击该按钮时,我将更改centerconstraint
的优先级:
centerConstraint.priority = .defaultLow
这在iOS13和iOS14模拟器上都能正常工作,而不像文档中描述的那样:
如果macOS中的required优先级或iOS中的UILayoutPriorityRequired优先级更改为较低的优先级,或者在将约束添加到视图后,较低的优先级更改为required优先级,将引发异常。
我想知道这份文件是不是过时了?是否可以在required和Nonrequired之间更改UILayoutConstriant的优先级?
奇怪的是,这确实在IOS12
上引发异常,但在13
或14
上却没有引发异常。
有可能文档已经过时,现在是允许的。
或者,它可能不是在这个例子中抛出异常,但在其他情况下可能会这样做。
一般来说,遵循文档(没有官方的冲突信息)是个好主意。
请注意,您可以将优先级设置为.DefaultLow
/.DefaultHigh
/.Required
以外的值...例如:
.priority = UILayoutPriority(rawValue: 999)
得到一个“更强的”执行(如果需要的话)。