在swift中设置约束的优先级

问题描述 投票:2回答:1

我一直在努力在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
        ])

任何帮助表示赞赏

swift constraints programmatically
1个回答
8
投票

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.