我一直在努力在swift中以编程方式优先考虑约束工作。
我的目标是使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
])
任何帮助表示赞赏
实际上,似乎需要三行代码才能在代码中设置优先级“基于锚点”的约束:
let widthConstraint = meetingFormView.widthAnchor.constraint(equalToConstant: 170)
widthConstraint.priority = UILayoutPriority(rawValue: 500)
widthConstraint.isActive = true
似乎我试图用isActive
声明Xcode(也许Swift?)设置let
并不认识到类型是NSLayoutConstraint
。使用UILayoutPriority(rawValue:)
似乎是设置优先级的最佳(唯一?)方式。
虽然这个答案与你正在做的完全不符,但我相信它会与IB合作。只需用创建let
替换IBOutlet
,就不需要isActive
线。
显然,要在代码中稍后更改优先级,您只需要:
widthConstraint.priority = UILayoutPriority(rawValue: 750)