Tor*_*sen 4 constraints swift programmatically
我一直在努力以编程方式迅速解决约束问题。
我的目标是使MeetingFormView的宽度不超过300。使用IB时,我会给宽度约束一个较低的优先级,而给“ lessThanOrEqualToConstant”一个较高的优先级。但是我无法正常工作。
我已经试过了:
meetingFormView.translatesAutoresizingMaskIntoConstraints = false
let constraintWidth = NSLayoutConstraint(
item: meetingFormView,
attribute: NSLayoutAttribute.width,
relatedBy: NSLayoutRelation.equal,
toItem: startView,
attribute: NSLayoutAttribute.width,
multiplier: 1,
constant: 0)
constraintWidth.priority = .defaultHigh
NSLayoutConstraint.activate([
meetingFormView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
meetingFormView.heightAnchor.constraint(equalToConstant: 170),
meetingFormView.widthAnchor.constraint(lessThanOrEqualToConstant: 300),
meetingFormView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
constraintWidth
])
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏
dfd*_*dfd 11
实际上,它似乎采取3行代码设置在代码优先“基于锚的”约束:
let widthConstraint = meetingFormView.widthAnchor.constraint(equalToConstant: 170)
widthConstraint.priority = UILayoutPriority(rawValue: 500)
widthConstraint.isActive = true
Run Code Online (Sandbox Code Playgroud)
似乎如果我尝试isActive使用let声明的Xcode 设置(也许是Swift?)无法识别类型为NSLayoutConstraint。并且使用UILayoutPriority(rawValue:)似乎是设置优先级的最佳方法(唯一?)。
尽管此答案与您的工作不完全一致,但我相信它可以与IB一起使用。只需将其替换为let创建一个IBOutlet,就不需要该isActive行了。
显然,要稍后在代码中更改优先级,您只需要:
widthConstraint.priority = UILayoutPriority(rawValue: 750)
Run Code Online (Sandbox Code Playgroud)
您可以编写一个像这样的小扩展:
extension NSLayoutConstraint
{
func withPriority(_ priority: Float) -> NSLayoutConstraint
{
self.priority = UILayoutPriority(priority)
return self
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
NSLayoutConstraint.activate([
...
meetingFormView.widthAnchor.constraint(lessThanOrEqualToConstant: 300).withPriority(500),
...
])
Run Code Online (Sandbox Code Playgroud)