快速设置约束条件

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)


Far*_*our 6

您可以编写一个像这样的小扩展:

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)