Установить приоритет на ограничения в Swift - PullRequest
0 голосов
/ 29 октября 2018

Я изо всех сил старался сделать так, чтобы ограничения работали программно в 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
        ])

Любая помощь приветствуется

1 Ответ

0 голосов
/ 30 октября 2018

На самом деле кажется, что требуется три строки кода, чтобы установить приоритетное ограничение на основе привязки в коде:

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)
...