UIView не меняет ширину, когда устройство изменилось - PullRequest
0 голосов
/ 13 марта 2020

У меня есть UIView в моей раскадровке. Значение Leading and Trailing равно 16, ширина элемента не фиксирована.

enter image description here

Я добавляю UILabels к этому UIView (-container), который будет двигаться до следующей «строки», когда новая и существующая UILabel превышает ширину контейнера. «Контейнерная ширина» (UIView.frame.size.width) составляет 382.

**// If current X + label width will be greater than container view width
// .. move to next row**
if (currentOriginX + labelHashtag.frame.width > containerWidth) {
      currentOriginX = 0
      currentOriginY += tagHeight + tagSpacingY
      }

Отлично работает для iPhone XSM:

enter image description here

Но когда я запускаю свой код на iPhone 8, ширина контейнера по-прежнему составляет 382, ​​и UILabels появляется на моем экране:

enter image description here

Почему размер моего UIView всегда одинаков? Почему не происходит автоматическое изменение размера при использовании ограничений в зависимости от устройства?

1 Ответ

0 голосов
/ 13 марта 2020

Откуда вы добавляете ярлыки? Если вы добавите их из метода viewDidLoad(), то это ожидаемый результат, потому что ваш контейнерный вид будет иметь ту же ширину, что и в раскадровке в этой точке, тогда он будет изменен по размеру экрана устройства. Вы можете использовать метод viewDidAppear(_:) для разметки надписей, но вам придется позаботиться об этом, поскольку возможна небольшая задержка с момента появления экрана и отрисовки надписей на экране.

Не используйте viewDidLayoutSubviews() для создания и добавления меток, потому что этот метод будет вызываться несколько раз. Однако вы можете использовать viewDidLayoutSubviews() для пересчета положения меток (на самом деле это был бы подход, который я рекомендовал бы).

Поэтому я рекомендую:

  1. Создайте метки в viewDidLoad() метод
  2. Позаботьтесь о том, чтобы ссылка на ваши метки (наиболее вероятный массив)
  3. В viewDidLayoutSubviews() вычислите позиции меток.
...