Скрыть организованные подпредставления в UIStackView вместо отсечения содержимого - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть UIStackView с тремя надписями, высота которых определяется с использованием динамического типа и текста, который может сильно различаться по длине.Контейнер для представления стека имеет фиксированную ширину и высоту в зависимости от размера экрана устройства (например, небольшого размера на iPhone SE). Я хочу центрировать представление стека внутри контейнера (с некоторыми внешними полями.)

Проблема заключается в том, что в зависимости от размера шрифта и высоты контейнера некоторые метки в представлении стека будут обрезаны.Вот пример с третьей меткой:

Third label in stack view is clipped

Я экспериментировал с приоритетами ограничения макета как для стека, так и для меток, но это не такКажется, это правильный подход.Вместо этого настройка видимости надписей работает лучше: поддерживается правильный интервал между элементами.

Тогда у меня вопрос, каково правильное время, чтобы определить, что высота надписи не отображается полностью и чтобы скрыть это.

Высота метки близка, но не совсем равна UIFont lineHeight, поэтому есть некоторое округление, которое делает это немного трудным.

Самая большая проблема заключается в том, что после прохода макета в UIStackView layoutSubviews высоты упорядоченных подпредставлений могут быть обнаружены, но вы не можете скрыть упорядоченные виды в этой точке, потому что это вызывает другой проход макета и рекурсию.

Так чего мне не хватает?: -)

Вот тестовый проект - постройте для iPhone Xs в симуляторе, и вы увидите те же результаты на скриншоте выше.

Решение

Суть Тома Ирвинга внизу указала мне в правильном направлении.Хитрость заключается в том, чтобы перечислить подпредставления после прохода макета и удалить их, если требования к высоте не выполнены.

Обновленный проект показывает, как это сделать в DebugStackView layoutSubviews.И да, UIStackView достойный противник.

1 Ответ

0 голосов
/ 27 февраля 2019

Не могли бы вы действовать на viewDidLoad?

Моя интуиция заключается в том, чтобы сложить высоту всех видимых подпредставлений в представлении стека и затем скрыть последнее, если есть проблема.

В предоставленном образце я бы порекомендовал получить CGSize с [self.firstLabel textRectForBounds:self.view.bounds limitedToNumberOfLines:0] для каждой видимой метки, удостовериться в том, что учитывалось поле между элементами, и определить, превышает ли общая высотапостоянная высота, назначенная стековому виду.Если это так, спрячьте элементы, которые выходят за пределы высоты стекового представления.

Конечно, проблема может быть гораздо большей, чем я понимаю, но это позволит вам вычислить до того, как пройдет layoutSubview проход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...