Определение того, какое из двух ограничений макета с разными приоритетами определяет значение измерения / привязки, на которое они влияют - PullRequest
0 голосов
/ 21 мая 2018

Скажем, у меня есть две NSLayoutConstraints с разными приоритетами, которые оба влияют на высоту некоторого вида ( middleView ).

Ниже middleView прикрепляется к нижней части topView, а его высота равна 500, если только верхняя часть bottomView не заставит его уменьшиться.

// topView and bottomView have well-defined constraints, and middleView has well defined x-axis/width constraints not shown here
middleView.topAnchor.constraint(isEqual: topView.bottomAnchor).isActive = true

let heightConstraint = middleView.heightAnchor.constraint(isEqualToConstant: 500)
heightConstraint.priority = UILayoutPriority.high
heightConstraint.isActive = true

let bottomConstraint = middView.bottomAnchor.constraint(isLessThanOrEqualTo: bottomView.topAnchor, constant: someMargin)
bottomConstraint.isActive = true // priority is .required by default

Помимо проверки, что высотаНа мой взгляд, 500, есть ли какой-то другой способ определить, какое из этих двух ограничений «действует»?Скажем, bottomView находится в таком положении, что если высота middleView меньше 500, имеет ли heightConstraint какое-либо свойство, позволяющее определить, что оно было обойдено ограничением с более высоким приоритетом, чем его собственное?

Мне бы хотелосьиспользовать heightConstraint в качестве своего рода «переключателя», который запускает что-то, когда это выполняется.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Нельзя ответить, потому что оба могут иметь некоторый эффект.Даже когда необязательное ограничение не может быть удовлетворено, оно может повлиять на макет.Из Руководство по автоматической компоновке :

Даже если дополнительное ограничение не может быть выполнено, оно все равно может повлиять на макет.Если в макете есть неопределенность после пропуска ограничения, система выбирает решение, наиболее близкое к ограничению.Таким образом, неудовлетворенные необязательные ограничения действуют как сила, притягивающая к ним взгляды.

Автоматический макет использует средство расчета ограничений для вычисления его значений.(Я полагаю, что он все еще использует Cassowary или что-то похожее на него.) Решатели ограничений - это, в основном, двигатели линейной алгебры.Вы помещаете в матрицу несколько линейных уравнений и пытаетесь решить их для некоторого вектора, который делает все «лучшим».Одним из компромиссов этого подхода является то, что все решается вместе, и не всегда очевидно , почему выбрано определенное значение.Это то, что есть, потому что это часть общего решения.(Таким образом, системы CSP очень похожи на системы машинного обучения. Они дают ответы, которые являются «правильными», но они не всегда предоставляют пошаговое обоснование, которое они могут использовать в качестве ветвления - если логика может.они могут быть настолько сложными для отладки.)

К вашему вопросу, я бы основал вашу логику на том, что вас действительно волнует.«Ограничение сработало» никогда не было тем, о чем вы заботились (тем более, что ограничения не «срабатывали»).Как правило, вы заботитесь о чем-то в результате (например, о последней высоте), поэтому вам следует это проверить.

0 голосов
/ 22 мая 2018

Похоже, это невозможно.Альтернативой может быть сравнение рассматриваемой константы размерности / привязки с возможными значениями.

...