Как установить автоматический размер текста для разных экранов

#ios #uilabel #swift4 #nslayoutconstraint #autoshrink

#iOS #uilabel #swift4 #nslayoutconstraint #автоматическая усадка

Вопрос:

Моя задача — сохранить размер и положение элементов внутри моей ячейки для разных разрешений экрана.

Я сделал:

  1. Установлены ограничения для красного и зеленого блоков (UILabels) во внешнем контейнере.
  2. Установите ограничение между ними равным 0. Это более приоритетно, чем ограничение красного блока снизу и зеленого — сверху.
  3. Установите Lines = 0 для этих меток.
  4. Установите автоматическую усадку.

В результате размер шрифта меняется на разных устройствах. Но все еще есть несколько проблем:

  1. Как я могу удалить слишком большие отступы над и под обеими метками?
  2. Как заставить их изменять размер равномерно? Теперь один из блоков имеет преимущество перед другим, в зависимости от того, какое ограничение установить с более высоким приоритетом. Если вы сделаете их равными — это также не сработает.

(Я хотел бы сделать все через 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>>