#ios #autolayout #nslayoutconstraint
#iOS #автозапуск #nslayoutconstraint
Вопрос:
Кажется, я не могу определить, как будут работать ограничения, поэтому в описательных терминах:
- текстовое поле расположено горизонтально по центру контейнера
- текстовое поле смещено на 100 пунктов от верхнего руководства по компоновке
- ширина текстового поля составляет 370 точек.
- если контейнер сжимается по ширине меньше 370 точек, он будет пропорционально корректироваться
- если экран становится шире, размер текстового поля не изменяется, а остается на уровне 370 пунктов
Я могу более или менее определить ограничения для большинства из них, за исключением возможности автоматически ограничивать его ширину, если экран уменьшается по ширине при меньших размерах экрана.
Некоторые указатели были бы хороши
Спасибо!
Ответ №1:
Вы можете добавить начальное и конечное ограничение к вашему текстовому полю с более низким приоритетом. И просто добавьте ограничение ширины, которое может быть <= 370.
Комментарии:
1. Основываясь на деталях, предоставленных ответчиком, я не думаю, что этот ответ правильный (на самом деле он обратный). Смотрите мой ответ, что я имею в виду.
2. Ну, я только что попробовал, и, похоже, он работает так, как я ожидаю, на симуляторах 5S и iPad! Возможно, я неправильно понял проблему!
3. На самом деле, я беру назад то, что я сказал. Я неправильно истолковал ваш ответ и пропустил
<
в последней части. Так что вы тоже правы! Это другой способ добиться того же результата.4. Спасибо, это работает, хотя я не совсем понимаю, как на это влияет более низкий приоритет, но интересно, что я никогда этого не пробовал.
5. Когда ограничения конфликтуют друг с другом, прерывается ограничение с более низким приоритетом. Подумайте об этом так: вам нужна МАКСИМАЛЬНАЯ ширина 370 и, по крайней мере, некоторое расстояние от сторон. Это приводит к двум сценариям, в одном из которых ширина огромна, а в другом — нет. В случае, когда ширина мала, ширина текстового поля уменьшается по мере его установки
<=
, а начальное и конечное значения не прерываются. Когда ширина экрана велика, максимальная ширина равна 370, а поскольку начальные и конечные значения имеют более низкий приоритет, они ломаются, поскольку они будут пытаться растянуть текстовое поле до ширины более 370.
Ответ №2:
Это должно сделать это:
let textField = UITextField()
view.addSubview(textField)
textField.translatesAutoresizingMaskIntoConstraints = false
// center horizontally
textField.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
// 100 from top layout guide
textField.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 100).isActive = true
// make sure textfield width never exceeds the superview width
textField.leftAnchor.constraint(greaterThanOrEqualTo: view.leftAnchor).isActive = true
textField.rightAnchor.constraint(lessThanOrEqualTo: view.rightAnchor).isActive = true
// give the textfield its default width, notice the lowered priority which allows this constraint to be broken when needed to satisfy the above constraints
let widthConstraint = textField.widthAnchor.constraint(equalToConstant: 370)
widthConstraint.priority = UILayoutPriorityDefaultHigh
widthConstraint.isActive = true
Комментарии:
1. Не будет ли более низкий приоритет ограничения ширины приводить к его разрыву, когда ширина экрана велика? Согласно вопросу, не должна ли ширина всегда оставаться максимальной 370?
2. Ограничение будет нарушено только в случае необходимости. На большом экране
leftAnchor
rightAnchor
ограничения and по-прежнему выполняются и не нарушают ограничение ширины. Так что нет, это должно работать идеально и удовлетворять всем перечисленным вами условиям. Просто попробуйте и посмотрите.