Товарищи разработчики, у меня проблемы с AutoLayout в Интерфейсном Разработчике (Xcode 5 / iOS 7). Это очень просто и важно, поэтому я думаю, что каждый должен знать, как это правильно работает. Если это ошибка в Xcode, то она критическая!
Поэтому, когда у меня есть такая иерархия представлений, я сталкиваюсь с проблемами:
>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)
UIScrollView имеет твердые ограничения, например, 50 пикселей со всех сторон (без проблем). Затем я добавляю ограничение Top Space в UILabel (без проблем) (и я могу даже зафиксировать высоту / ширину метки, ничего не меняя, но должно быть излишним из-за собственного размера метки)
Проблема начинается, когда я добавляю конечное ограничение к UILabel:
Например, пробел в: Superview Равно: 25
Теперь появляются два предупреждения - и я не понимаю, почему:
A) Неоднозначность прокручиваемого размера контента (вид прокрутки имеет неоднозначную высоту / ширину прокручиваемого содержимого)
B) Неверные представления (ожидаемая метка: x = -67 Фактическая: x = 207
Я сделал этот минимальный пример в новом проекте, который вы можете загрузить, и приложил скриншот. Как вы можете видеть, Interface Builder ожидает, что Label будет находиться за пределами границы UIScrollView (оранжевый пунктирный прямоугольник). Обновление фрейма метки с помощью инструмента устранения проблем перемещает его прямо туда.
Обратите внимание: если вы замените UIScrollView на UIView, поведение будет таким, как ожидалось (рамка метки правильная и соответствует ограничению). Так что, кажется, либо проблема с UIScrollView, либо я упускаю что-то важное.
Когда я запускаю приложение без обновления фрейма метки, как предлагает IB, он очень хорошо позиционируется, именно там, где он должен быть, и UIScrollView прокручивается. Если я ДЕЙСТВИТЕЛЬНО обновляю фрейм, метка исчезает из виду, и UIScrollView не прокручивается.
Помоги мне Оби-Ван Кеноби! Почему неоднозначное расположение? Почему неуместный вид?
Вы можете скачать пример проекта здесь и попробовать, если вы можете выяснить, что происходит: https://github.com/Wirsing84/AutoLayoutProblem
UIScrollView
напрямую. Вместо этого используйтеUICollectionView
илиUITableView
как можно больше, в большинстве случаев с этим элементом возможно все, и это также дает простоту, удобочитаемость и возможность повторного использования !!!Ответы:
Так что я просто разобрался таким образом:
Внутри
UIScrollView
добавитьUIView
(мы можем назвать этоcontentView
);При этом
contentView
, множество сверху, снизу, слева и правого полей до 0 (конечно изscrollView
которых являетсяsuperView
); Установите также выравнивать центр по горизонтали и вертикали ;Закончено .
Теперь вы можете добавить все ваши мнения в том , что
contentView
, иcontentSize
изscrollView
автоматически будет изменен в соответствии сcontentView
.Обновить:
Некоторые особые случаи описаны в этом видео, размещенном @Sergio в комментариях ниже.
источник
Эта ошибка заняла у меня какое-то время, чтобы отследить, сначала я попытался закрепить размер ScrollView, но в сообщении об ошибке четко указано «размер содержимого». Я удостоверился, что все, что я прикрепил от вершины ScrollView, было также прикреплено к основанию. Таким образом, ScrollView может рассчитать высоту своего содержимого, найдя высоту всех объектов и ограничений. Это решило неоднозначную высоту содержимого, ширина была примерно одинаковой ... Изначально у меня большинство элементов X было в центре ScrollView, но мне также пришлось прикрепить объекты к стороне ScrollView. Мне это не нравится, потому что iPhone6 может иметь более широкий экран, но он уберет ошибку «неоднозначной ширины контента».
источник
Xcode 11+
Самый простой способ с использованием
autolayout
:UIScrollView
и прикрепите это0,0,0,0
к superview (или вашему желаемому размеру)UIView
в ScrollView, придавить его0,0,0,0
на все 4 стороны и центр егоhorizontally
иvertically
.bottom
иalign center Y
приоритете 250. (для горизонтального изменения прокруткиtrailing
иalign center X
)UIScrollView
, выберите инспектор размера и отмените выборContent Layout Guides
.источник
Это ответ на мой вопрос: UIScrollView + Центрированный просмотр + Неоднозначный прокручиваемый размер контента + множество размеров iPhone .
Но это полностью покрывает и ваше дело!
Итак, вот начальное состояние для простейшего случая:
Has ambiguous scrollable content width
иHas ambiguous scrollable content height
.Все, что нам нужно сделать, это:
Важно: вы должны добавить трейлинг и / или нижние ограничения. Не "ведущий и топ" - это не работает!
Вы можете проверить это в моем примере проекта , который демонстрирует, как решить эту проблему.
PS
Согласно логике - это действие должно вызывать «противоречивые ограничения». Но нет!
Я не знаю, почему это работает и как XCode определяет, какое ограничение является более приоритетным (потому что я не установил приоритет для этих ограничений). Я буду благодарен, если кто-то объяснит, почему это работает в комментариях ниже.
источник
Xcode 11+, Swift 5
Если вас интересует, почему все ответы больше не работают, убедитесь, что вы прикрепили представление контента (то, которое вы поместили в представление прокрутки) в Руководство по макету содержимого в представлении прокрутки и НЕ в Руководство по макету кадра.
Края представления содержимого (ведущий, задний, верхний, нижний) не должны быть закреплены как ведущие на изображении - в Frame Layout Guide
но вот так - к Content Layout Guide.
И тогда большинство ответов будет работать для вас.
Самый простой подход сейчас выглядит так:
В целом ваша структура в простейшей реализации будет выглядеть так
источник
Вам необходимо создать
UIView
как подпредставление,UIScrollView
как описано ниже:UIViewController
UIView
«Главный вид»UIScrollView
UIView
«Вид контейнера»Второй шаг - сделать
UIScrollView
ограничения. Я сделал это с верхним, нижним, ведущим и конечным ограничениями для его superView.Затем я добавил ограничения для контейнера
UIScrollView
и вот где начинается проблема. Когда вы накладываете те же ограничения (сверху, снизу, впереди и сзади), раскадровка выдает предупреждение:«Имеет неоднозначную ширину прокручиваемого содержимого» и «Имеет неоднозначную высоту прокручиваемого содержимого»
Продолжайте действовать с теми же ограничениями, что и выше, и просто добавьте ограничения
Equal Height
иEqual Width
к своему Контейнерному представлению по отношению к Основному представлению, а не к вашемуUIScrollView
. Другими словами, ограничения Контейнерного Представления связаныUIScrollView
с суперпредставлением.После этого у вас не будет предупреждений в раскадровке, и вы сможете продолжить добавлять ограничения для ваших подпредставлений.
источник
Я была такая же проблема. Снимите этот флажок. Так как вы устанавливаете размер контента в коде.
источник
Я наконец понял это, надеюсь, это легче понять.
Вы часто можете обойти это предупреждение, добавив базовый UIView в представление прокрутки как «представление контента», как они упоминали, и сделайте его таким же размером, что и представление прокрутки, и в этом представлении содержимого задайте эти 6 параметров.
Как видите, вам нужно всего 6 параметров! Что ... при нормальных обстоятельствах вы дублируете 2 ограничения, но это способ избежать этой ошибки раскадровки.
источник
Я знаю, что могу опоздать, но следующее решение решает такие проблемы без дополнительного кода , просто используя раскадровки:
Для просмотра содержимого вам необходимо установить ограничения для начальных / конечных / верхних / нижних пробелов для просмотра прокрутки, и это не изменит рамки просмотра содержимого , например:
Конечно, вам нужно создать дополнительные ограничения для представления содержимого, чтобы представление прокрутки могло знать размер содержимого. Например, установите фиксированную высоту и центр х.
Надеюсь это поможет.
источник
Для меня добавление
contentView
не очень работает, как предлагалось. Кроме того, это создает издержки из-за добавленного представления (хотя я не считаю это большой проблемой). Для меня лучше всего было просто отключить проверку неоднозначности для меняscrollView
. Все хорошо выглядит, так что я думаю, что это нормально в простых случаях, таких как мой. Но имейте в виду, что, если другие ограничения для вашегоscrollView
перерыва, Interface-Builder больше не будет предупреждать вас об этом.источник
Посмотрите этот очень быстрый и конкретный урок о том, как заставить представление прокрутки работать и полностью прокручиваться с помощью автоматического макета. Теперь, единственное, что все еще оставляет меня озадаченным, это то, почему размер содержимого представления прокрутки всегда больше необходимого.
http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/
источник
См. Ниже: представление контента в вертикальной и горизонтальной горизонтальной прокрутке. вы получили ошибку неоднозначности, всегда проверяйте, что два добавленных в представление прокрутки из вашего представления контента: 1) .button space to container.2) конечный пробел до ограничения, выделенного на скриншоте,
Эти ограничения означают, что в прокрутке вы можете прокручивать после высоты или ширины представления контента.
это может помочь вам.
источник
Я решил эту проблему для своего вида, используя «Устранить проблемы с автоматическим макетом»> «Добавить отсутствующие ограничения» для выбранного представления.
Следующие два ограничения решают мою проблему:
в котором: трейлинг, низ - трейлинг, низ UIScrollView
источник
Используя contentView (
UView
) в качестве контейнера внутриUIScrollView
, ручки к краям (top
,bottom
,trailing
,leading
) из надтаблицы (UIScrollView
) иcontentView
должны иметьequalwidth
иequalheight
к надтаблице. Это ограничения. И вызов метода:Решенные проблемы для меня.
источник
Свифт 4+ подход:
1) Установите UIScrollView верхний, нижний, левый и правый поля на 0
2) Внутри UIScrollView добавьте UIView и установите верхние, нижние, ведущие, конечные поля равными 0 (равным полям UIScrollView).
3) Наиболее важной частью является установка ширины и высоты, где ограничение по высоте должно иметь низкий приоритет .
источник
@Matteo Gobbi ответ идеален, но в моем случае скролл не может прокручиваться, я убираю « выровнять центр Y » и добавляю « height> = 1 », прокрутка становится прокручиваемой
источник
Люди, которые борются с отсутствием прокрутки uiscrollview, просто устанавливают нижнее ограничение вашего представления контента с нижним макетом вашего последнего представления (который находится внутри вашего представления контента). Не забудьте снять ограничение по центру Y.
Остальные все ограничения такие же, как определено выше. Scrollview заботится только о том, чтобы получить максимальную высоту из его представления содержимого, и мы устанавливаем его как нижнее ограничение последнего представления, что означает, что scrollview автоматически изменит смещение содержимого.
В моем случае последнее представление было UILable без свойства lines = 0 (которое автоматически регулирует его высоту в зависимости от его содержимого), поэтому оно динамически увеличивало высоту uilable, и в итоге наша прокручиваемая область увеличивается, поскольку нижний макет uilable выравнивается по низу нашего представления содержимого, что заставляет scrollview увеличивать смещение контента.
источник
Я сделал видео на YouTube
Scroll StackViews, используя только раскадровку в XCode
Я думаю, что 2 вида сценариев могут появиться здесь.
Вид внутри scrollView -
UIView
)UIStackView
)Для просмотра с вертикальной прокруткой в обоих случаях необходимо добавить следующие ограничения:
4 ограничения сверху, слева, снизу и справа.
Равная ширина прокрутки (чтобы остановить горизонтальную прокрутку)
Вам не нужны никакие другие ограничения для представлений, которые имеют собственную высоту содержимого.
Для представлений, которые не имеют внутренней высоты содержимого, необходимо добавить ограничение высоты. Представление будет прокручиваться только в том случае, если ограничение по высоте превышает высоту scrollView.
источник
Вывод:
источник
В моем случае я получил проблему с неправильным размером контента и размером Ambiguity в iPad, но работал на iPhone. Я сделал следующие изменения в раскадровке, чтобы решить эту проблему.
источник
Вертикальная прокрутка
источник
Что я сделал, это создал отдельный вид контента, как показано здесь.
Представление содержимого имеет произвольную форму и может иметь все подпредставления, добавленные к нему со своими собственными ограничениями по отношению к представлению содержимого.
UIScrollView добавляется в контроллер основного вида.
Программно я добавляю contentView, который связан через IBOutlet, к классу и устанавливаю contentView UIScrollView.
источник
Я получаю ту же ошибку .. я сделал следующее
Теперь добавьте начальные / конечные / верхние / нижние для scrollView (2), а затем UIView (3).
Выберите View (1) и View (3), чтобы установить одинаковый рост и вес. Это решило мою проблему.
Я сделал видео, которое поможет:
https://www.youtube.com/watch?v=s-CPN3xZS1A
источник
[протестировано в XCode 7.2 и для iOS 9.2]
Что подавляло ошибки и предупреждения раскадровки для меня, так это установление внутреннего размера представления прокрутки и представления содержимого (в моем случае, стека) для Placeholder . Этот параметр находится в Инспекторе размеров в Раскадровке. И это говорит - Установка внутреннего размера времени разработки влияет только на представление при редактировании в Интерфейсном Разработчике. Представление не будет иметь этот собственный размер содержимого во время выполнения.
Итак, я полагаю, мы не ошибемся, установив это.
Примечание. В раскадровке я закрепил все края скроллвью в суперпредставлении и все края стека в скроллвью. В моем коде я установил значение translatesAutoresizingMaskIntoConstraints как ложное как для вида scrollview, так и для стека. И я не упомянул размер контента. Когда динамический рост стека увеличивается, ограничения, установленные в раскадровке, обеспечивают возможность прокрутки стека.
Предупреждение о раскадровке сводило меня с ума, и я не хотел центрировать вещи по горизонтали или вертикали только для того, чтобы подавить предупреждение.
источник
Если кто-то ведет себя так, что вы замечаете полосу прокрутки на правильных свитках, но контент не перемещается, этот факт, вероятно, стоит рассмотреть:
Это из документации Apple . Например, если вы случайно прикрепили верхний ярлык / кнопку / изображение / вид к виду за пределами области прокрутки (может быть, заголовок или что-то прямо над scrollView?) Вместо contentView, вы бы заморозили весь свой contentView на месте.
источник
Как упоминалось в предыдущих ответах, вы должны добавить пользовательский вид в представление прокрутки:
Добавьте все ваши подпредставления к представлению контента. В какой-то момент вы увидите, что представление содержимого прокрутки имеет неоднозначное предупреждение о размере содержимого, вам следует выбрать представление содержимого и нажать кнопку «Устранить проблемы с автоматической разметкой» (в правом нижнем углу макета IB) и выбрать «Добавить отсутствующие». ограничения ».
С этого момента, когда вы запускаете проект, представление прокрутки автоматически обновляет его размер контента, без дополнительного кода.
источник
В моем случае - горизонтально прокручиваемом виде прокрутки - мне также нужно было добавить ограничения ширины и высоты для каждого дочернего элемента вида прокрутки, хотя в технической заметке Apple об этом не говорится.
источник
Установите размер ViewController (тот, который содержит UIScrollView) на Freeform в Инспекторе размеров в Интерфейсном Разработчике, и все должно работать.
Настройка произвольной формы в Инспекторе размера в Интерфейсном Разработчике для содержащего UIViewcontroller
источник
Если у вас все еще есть проблемы с UIScrollView, просто отключите направляющие макета содержимого (выберите ScrollView в xcode Interface Builder -> выберите инспектор размера на правой панели -> отмените выбор «Руководства по макету содержимого») или попробуйте выполнить следующие действия: xcode 11 scroll view layout - это может быть полезно для нового стиля верстки. Отлично работает на macOS 10.15.2, Xcode 11.3.1, для 05.02.2020
смотреть скриншот
источник
Использование Autolayout
Добавьте представление прокрутки в хорошо определенное представление, а затем добавьте представление стека в представление прокрутки
Добавьте ограничения сверху, слева, справа, снизу, по центру X и по центру Y из вида прокрутки и стека в соответствующие супер-виды
Убедитесь, что ограничения связаны из стекового представления с правильным суперпредставлением (scrollview), поскольку текущая настройка по умолчанию - добавить ограничение Align Top, а не ограничение Top Space.
источник