Что означает наличие нескольких ограничений ширины на одном UIButton? - PullRequest
0 голосов
/ 08 февраля 2019

Для краткости я прокомментировал создание левого ограничения и показываю только код для создания ограничения ширины.

В кодированном виде каждая кнопка в rowView раскрывается одинаково.Когда я удаляю создание widthConstraint, все кнопки уменьшаются до их собственного размера (за исключением первой кнопки в rowView).Первая кнопка в строке раскрывается до заполнения.

for (index, button) in buttons.enumerated() {
    if index == 0 {
        // Leftmost button's left edge 
        // constrained to the left edge 
        // of the rowView
    } else {
        // Else constrain button's left edge to 
        // the right edge of the button to the left

        // But what does the below width constraint
        // accomplish?
        let firstButton = buttons[0]
        let widthConstraint = NSLayoutConstraint(item: firstButton, attribute: .width, relatedBy: .equal, toItem: button, attribute: .width, multiplier: 1.0, constant: 0.0)
        widthConstraint.priority = UILayoutPriority(rawValue: 800.0)
        rowView.addConstraint(widthConstraint)
    }
}

Итак, для каждого button в массиве кнопок создайте ограничение ширины для firstButton, равное ширине button,и добавьте это ограничение к rowView.

Не означает ли это, что у меня есть несколько ограничений по ширине на firstButton?Или последующие ограничения ширины заменяют предыдущие?

1 Ответ

0 голосов
/ 09 февраля 2019

Ограничения не работают как обычные присваивания в языках программирования.Таким образом, присвоение одного атрибута одному элементу не означает переопределение его каждый раз.Думайте об ограничениях как о системе уравнений, потому что на самом деле они являются системой уравнений.Когда Autolayout пытается вычислить размеры видов, он просто решает эту систему уравнений на основе ваших ограничений.Вот почему иногда вы видите предупреждения неоднозначности ограничений внутри раскадровок, потому что в ваших ограничениях недостаточно информации для успешного решения системы и поиска значений для всех переменных.

Так что в вашем случае система будет выглядеть так

a = b
a = c
a + b + c = 300

Вы можете легко рассчитать, что a, b и c имеют значение 100.Все они width кнопок в вашем случае.И вы видите, что вы присваиваете a дважды, но это не присваивание, как в языках программирования, а знак равенства, как в алгебре.Итак, поэтому нормально иметь несколько ограничений для одного параметра просмотра, но они должны быть разрешимыми.

Если у вас есть ограничения, одно из которых говорит, что ширина должна быть 100pt, а другое - что >200ptесть конфликт.И вам нужно решить это самостоятельно.

Вы можете прочитать больше здесь, в Apple docs .

...