UIScrollView + центрированный вид + неоднозначный прокручиваемый размер контента + множество размеров iPhone
Я имею:
- приложение, которое должно работать в ландшафтном и портретном режиме.
- вид с полноразмерной прокруткой сверху.
- какой-то вид внутри прокрутки с фиксированной шириной и высотой. (с добавленными ограничениями H и W)
- установите для просмотра внутри прокрутки как горизонтальный по центру в контейнере. (добавлено в соответствии с ограничением)
У меня есть предупреждение в конструкторе интерфейса "Имеет неоднозначную ширину прокручиваемого содержимого".
Единственный способ решить эту проблему, который я знаю, - это установить конечные и ведущие ограничения. Но для разных айфонов (5,5", 4,7", 4") мне нужно установить разные трейлинг и лидирующие ограничения.
Как я могу устранить это предупреждение и по-прежнему иметь горизонтальное представление по центру с фиксированными W и H для всех размеров iPhone?
Я создаю Github репо, чтобы проиллюстрировать эту проблему: ScrollViewAmbigous
Это не является дубликатом неоднозначности размера прокручиваемого содержимого UIScrollView, но похоже (и не отвечает, хотя), но этот вопрос особенно касается разных размеров iPhone.
3 ответа
Утром со свежей чашкой кофе я разобрался с этим вопросом!
Итак, вот начальное состояние для простейшего случая:
- scrollView с 0 ограничениями для всех ребер
- Кнопки по центру по горизонтали и вертикали с фиксированной шириной и высотой
- И, конечно же,
Has ambiguous scrollable content width
а такжеHas ambiguous scrollable content height
досадные предупреждения.
Все, что нам нужно сделать, это:
- Добавьте 2 дополнительных ограничения, например "0" для конечного и / или нижнего пробела для нашего представления (в моем случае - UIButton)
Важно: вы должны добавить трейлинг и / или нижние ограничения. Не "ведущий и топ" - это не работает!
Вы можете проверить это в моем примере проекта, демонстрирующего, как решить эту проблему: ScrollViewAmbigous
PS
Я не знаю, почему это работает и как XCode определяет, какое ограничение является более приоритетным (потому что я не устанавливаю приоритет для этих ограничений), но я буду благодарен, если кто-то объяснит, почему это работает в комментариях ниже.
Проблема:
- Предупреждение говорит нам, что размер содержимого прокрутки зависит от его подпредставлений.
- в то время как ваше подпредставление не имеет строгого правила позиции и размера (без фиксированных ограничений), оно будет сбивать с толку сгенерированный размер содержимого прокрутки.
Решение:
- Сделайте только одно подпредставление в качестве "contentView" для scrollview.
Добавьте строгие (фиксированные) ограничения к этому "contentView".
Лучшая практика: ширина и высота равны виду прокрутки.
- Добавьте все другие подпредставления и ограничения в ваш "contentView".
Кажется, в этом вопросе много путаницы. Я предполагаю, что UIScrollView должен иметь ДВА ограниченных пробела, "внутренний", соединяющий его с одним из его подпредставлений (чтобы он мог знать ширину содержимого), и другой "внешний", соединяющий его с родным или супервизором, чтобы он знает ширину своего кадра.
Тот же принцип применяется для высоты, то есть два нижних ограничения пространства.