提问者:小点点

是否可以在required和nonrequired之间更改nslayoutconstraint的优先级?


如文件所述:

优先级不能从非必需变为必需,也不能从必需变为非必需。

然而,当我试图这样做的时候,我成功了。下面是我的示例代码:

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和一个SigninViewSigninButton有两个约束。一个优先级为.required(默认),另一个优先级为.defaulthigh

然后,当用户单击该按钮时,我将更改centerconstraint的优先级:

centerConstraint.priority = .defaultLow

这在iOS13和iOS14模拟器上都能正常工作,而不像文档中描述的那样:

如果macOS中的required优先级或iOS中的UILayoutPriorityRequired优先级更改为较低的优先级,或者在将约束添加到视图后,较低的优先级更改为required优先级,将引发异常。

我想知道这份文件是不是过时了?是否可以在required和Nonrequired之间更改UILayoutConstriant的优先级?


共1个答案

匿名用户

奇怪的是,这确实在IOS12上引发异常,但在1314上却没有引发异常。

有可能文档已经过时,现在是允许的。

或者,它可能不是在这个例子中抛出异常,但在其他情况下可能会这样做。

一般来说,遵循文档(没有官方的冲突信息)是个好主意。

请注意,您可以将优先级设置为.DefaultLow/.DefaultHigh/.Required以外的值...例如:

.priority = UILayoutPriority(rawValue: 999)

得到一个“更强的”执行(如果需要的话)。