快速设置约束条件

时间:2018-10-29 17:18:28

标签: swift constraints 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
        ])

感谢您的帮助

1 个答案:

答案 0 :(得分:6)

实际上似乎需要三行代码才能在代码中设置优先的“基于锚定”约束:

let widthConstraint = meetingFormView.widthAnchor.constraint(equalToConstant: 170)
widthConstraint.priority = UILayoutPriority(rawValue: 500)
widthConstraint.isActive = true

似乎如果我尝试将isActive设置为let,则声明Xcode(也许是Swift?)无法识别类型为NSLayoutConstraint。并且使用UILayoutPriority(rawValue:)似乎是设置优先级的最佳方法(唯一?)。

尽管此答案与您所做的完全不符,我相信它可以与IB一起使用。只需将let替换为创建IBOutlet,就不需要isActive行。

很明显,要稍后在代码中更改优先级,您只需:

widthConstraint.priority = UILayoutPriority(rawValue: 750)