#ios #uilabel #swift4 #nslayoutconstraint #autoshrink
#iOS #uilabel #swift4 #nslayoutconstraint #автоматическая усадка
Вопрос:
Моя задача — сохранить размер и положение элементов внутри моей ячейки для разных разрешений экрана.
Я сделал:
- Установлены ограничения для красного и зеленого блоков (UILabels) во внешнем контейнере.
- Установите ограничение между ними равным 0. Это более приоритетно, чем ограничение красного блока снизу и зеленого — сверху.
- Установите Lines = 0 для этих меток.
- Установите автоматическую усадку.
В результате размер шрифта меняется на разных устройствах. Но все еще есть несколько проблем:
- Как я могу удалить слишком большие отступы над и под обеими метками?
- Как заставить их изменять размер равномерно? Теперь один из блоков имеет преимущество перед другим, в зависимости от того, какое ограничение установить с более высоким приоритетом. Если вы сделаете их равными — это также не сработает.
(Я хотел бы сделать все через Interface Builder)
Ответ №1:
Вы можете воспользоваться ограничениями равной высоты и равной ширины.
Следуйте приведенным ниже шагам, чтобы сделать интервал между UILabel одинаковым на iPhone 8 и iPhone 4s. Это поможет вам сделать его пропорциональным.
1) Для достижения этого просто выберите свою метку (красную), label (зеленую) и superview (ячейкой которого, я думаю, вы являетесь UICollectionView
)
2) Здесь мы заинтересованы в сохранении пропорциональности высоты. то есть красная метка (80%) и зеленая метка (20%)
В настоящее время все высоты равны высоте супервизора, т. е. высота RedLabel и Greenlabel равна 100% высоты супервизора.
Но цель состоит в том, чтобы сделать его 80% и 20% для красной и зеленой метки соответственно.
Поэтому выберите ограничение высоты красной метки. Здесь вы устанавливаете ограничение, которое гласит: «высота красной метки должна составлять 80% от высоты супервизий».
Аналогично для зеленой метки установите «высоту зеленой метки так, чтобы она составляла 20% от высоты супервизора».
Красная метка
Зеленая метка
3) Теперь выполните ограничение положения по осям x и y, которое было бы простым
a) Красная метка впереди = передний край супервизора
б) Красная метка в конце = задний край супервизора
c) Красная метка сверху = верхний край супервизора
d) Красная метка внизу = не требуется (поскольку у нее есть все необходимые ограничения для обоснования ее положения, т. е. высота = 0,8 * superview, и она выровнена по верху, например: высота super view равна 100, выровняйте этот вид по верху с height = 80 )
e) Начало зеленой метки = Начало красной метки (вы уже установили это в пункте «a», нет необходимости снова устанавливать ограничение для зеленой метки)
f) Зеленая метка в конце = Красная метка в начале (вы уже установили это в пункте «b», нет необходимости снова устанавливать ограничение для зеленой метки)
g) Зеленая метка внизу = нижняя часть супервизора
h) Зеленая метка сверху = не требуется (поскольку она имеет все необходимые ограничения для обоснования ее положения, т. е. высота = 0,2 * superview и выровнена по низу, например: высота super view равна 100, выровняйте этот вид снизу по высоте = 20)
Это окончательный список ограничений и предварительный просмотр раскадровки для iPhone 8 и 4s.
Комментарии:
1.Спасибо за ответ, это кажется правильным. Только сейчас я получаю ошибку при сборке. Я не совсем понимаю, с чем это связано.
Exception name: NSGenericException
Exception reason: Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal. constraint:<NSLayoutConstraint:0x7fb204d99d50 UILabel:0x7fb204cb4d10'07.18'.height == 0.18*UICollectionViewCell:0x7fb204d943f0.height (active)> view:<UILabel: 0x7fb204cb4d10; frame = (11 154; 179 36); text = '07.18'; layer = <_UILabelLayer: 0x7fb204cb5000>>