UIScrollView прокручиваемый размер содержимого неоднозначность

512

Товарищи разработчики, у меня проблемы с 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

Иллюстрация проблемы в Интерфейсном Разработчике

Вирзинг
источник
8
Попробуйте разместить UILabel в представлении содержимого, затем установите задний край метки для представления содержимого (обычный UIView). Это видео может вам очень помочь: youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be
erdekhayser
1
Отличное видео, но оно не исправило предупреждения для меня. :(
мистер Роджерс
Большое спасибо за видео - было (довольно удивительно) довольно много я узнал из этого! Однако, когда я объединяю знания видео со stackoverflow.com/questions/18953617/… я могу исправить предупреждения. Остается вопрос: как сделать размер contentView scrollView настолько большим, насколько это необходимо?
WIRING
Посмотрите на это видео. В нем показано, как использовать UIScrollLayout и autolayout с XCode 5 / iOS 7.
Jaxvy
Мое предложение не использовать UIScrollViewнапрямую. Вместо этого используйте UICollectionViewили UITableViewкак можно больше, в большинстве случаев с этим элементом возможно все, и это также дает простоту, удобочитаемость и возможность повторного использования !!!
Спатель

Ответы:

1093

Так что я просто разобрался таким образом:

  1. Внутри UIScrollView добавитьUIView (мы можем назвать это contentView);

  2. При этом contentView, множество сверху, снизу, слева и правого полей до 0 (конечно из scrollViewкоторых является superView); Установите также выравнивать центр по горизонтали и вертикали ;

Закончено .

Теперь вы можете добавить все ваши мнения в том , что contentView, и contentSizeиз scrollViewавтоматически будет изменен в соответствии с contentView.

Обновить:

Некоторые особые случаи описаны в этом видео, размещенном @Sergio в комментариях ниже.

Маттео Гобби
источник
33
Почти идеально, за исключением того, что представление прокрутки больше не может угадать длину вашего контента и соответственно изменить его размер, это contentSize, чтобы соответствовать объектам внутри. У меня есть представление таблицы внутри contentView, высота которого изменяется (через ограничение), и представление прокрутки не позволяет мне прокручивать.
CyberMew
28
Возможно, это видео поможет преодолеть все оставшиеся проблемы.
Серхио
46
это не заставляет это прокручивать это.
Дориан
2
@MatteoGobbi Вот и все! Это добилось цели! Бороться с такого рода проблемами сумасшествия scrollView autoLayout в течение 2 дней .... Спасибо тебе, чувак !!!
polo987
56
Для тех, кто сталкивается с проблемой невозможности прокрутки в ScrollView, установка нижней части contentView и выравнивание по центру по вертикали с низким приоритетом помогли мне!
jimmy0251
98

Эта ошибка заняла у меня какое-то время, чтобы отследить, сначала я попытался закрепить размер ScrollView, но в сообщении об ошибке четко указано «размер содержимого». Я удостоверился, что все, что я прикрепил от вершины ScrollView, было также прикреплено к основанию. Таким образом, ScrollView может рассчитать высоту своего содержимого, найдя высоту всех объектов и ограничений. Это решило неоднозначную высоту содержимого, ширина была примерно одинаковой ... Изначально у меня большинство элементов X было в центре ScrollView, но мне также пришлось прикрепить объекты к стороне ScrollView. Мне это не нравится, потому что iPhone6 ​​может иметь более широкий экран, но он уберет ошибку «неоднозначной ширины контента».

self.name
источник
31
Спасибо за ваш ответ! Если я вас правильно понимаю, вы добьетесь устранения ошибки, закрепив каждое подпредставление в ScrollView сверху и снизу. Однако в этом нет необходимости. Вам просто нужно убедиться, что есть способ создать непрерывную линию ограничений сверху вниз для прокрутки. [-XXX] Надеюсь, это было понятно;>
Wirsing
1
Как решить проблему, если представление имеет переменную высоту? Как мне установить ограничения, чтобы scrollview мог рассчитать размеры?
hashier
2
«Вам просто нужно убедиться, что есть способ создать непрерывную линию ограничений сверху донизу прокрутки» <- спасибо за это предложение
Адам Уэйт
3
Что помогло мне, так это то, что вид прокрутки был прикреплен к суперпредставлению, а не к верхним или нижним направляющим макета. Я удалил ограничение для нижнего руководства по разметке и прошел через меню вместо конструктора интерфейса. Редактор -> Pin -> Bottom Space для Superview.
Альберто Лопес
2
Если вы хотите, чтобы ширина прокрутки соответствовала ширине экрана вашего телефона или любого другого элемента в вашем пользовательском интерфейсе (например, содержащего UIView), вам нужно установить для него «равную ширину», используя другой элемент, который находится за пределами прокрутки для измерения.
Departamento B
89

Xcode 11+

Самый простой способ с использованием autolayout:

  1. Добавьте UIScrollViewи прикрепите это 0,0,0,0к superview (или вашему желаемому размеру)
  2. Добавить UIViewв ScrollView, придавить его 0,0,0,0на все 4 стороны и центр его horizontallyи vertically.
  3. В размере инспектора, изменения bottomи align center Yприоритете 250. (для горизонтального изменения прокрутки trailingи align center X)
  4. Добавьте все представления, которые вам нужны, в это представление. Не забудьте установить нижнее ограничение для самого нижнего вида.
  5. Выберите UIScrollView, выберите инспектор размера и отмените выбор Content Layout Guides.
Đorđe Nilović
источник
1
Мне не удалось установить высоту содержимого scrollview, но это работает. :)
Слепой ниндзя
2
Подсказка: у меня это работало только, если я удалил центр по горизонтали и вертикали и заменил его равной шириной (scrollView + view внутри scrollView) И добавил высоту, основанную на содержимом, что означает, что последний элемент представления нуждается в нижнем ограничении. Смотрите здесь для получения дополнительной информации: stackoverflow.com/a/54577278/5056173
Шон Стейнс
1
Шон, я использую это буквально каждый день, и у меня никогда не было проблем с этим подходом, когда речь идет о вертикальной и горизонтальной прокрутке прокрутки. Может быть, вы забыли установить нижнее ограничение для самого нижнего / последнего элемента. Без этого это не сработает.
đorđe Nilović
7
Пункт № 4 - второе предложение является большим.
Nitish
2
этот ответ отлично сработал для меня
Satvinder Singh
63

Это ответ на мой вопрос: UIScrollView + Центрированный просмотр + Неоднозначный прокручиваемый размер контента + множество размеров iPhone .

Но это полностью покрывает и ваше дело!

Итак, вот начальное состояние для простейшего случая:

  1. scrollView с 0 ограничениями для всех ребер
  2. Горизонтальные и вертикальные по центру кнопки с фиксированными ограничениями ширины и высоты
  3. И, конечно же - досадные предупреждения Has ambiguous scrollable content width и Has ambiguous scrollable content height.

1

Все, что нам нужно сделать, это:

  • Добавьте 2 дополнительных ограничения, например «0» для конечного и / или нижнего пробела для нашего представления (посмотрите на пример на скриншоте ниже).

Важно: вы должны добавить трейлинг и / или нижние ограничения. Не "ведущий и топ" - это не работает!

2

Вы можете проверить это в моем примере проекта , который демонстрирует, как решить эту проблему.

PS

Согласно логике - это действие должно вызывать «противоречивые ограничения». Но нет!

Я не знаю, почему это работает и как XCode определяет, какое ограничение является более приоритетным (потому что я не установил приоритет для этих ограничений). Я буду благодарен, если кто-то объяснит, почему это работает в комментариях ниже.

skywinder
источник
Отличный совет! В итоге я просто создал ограничение для нижнего края и установил приоритет на средний или низкий
декан
Вот Это Да! Это серьезно не имеет никакого смысла, но работает! Спасибо! Последний элемент, который у меня есть, я установил для нижнего ограничения 0 и BANG. Наконец-то сработало.
Якоб Хвиид
60

Xcode 11+, Swift 5

Если вас интересует, почему все ответы больше не работают, убедитесь, что вы прикрепили представление контента (то, которое вы поместили в представление прокрутки) в Руководство по макету содержимого в представлении прокрутки и НЕ в Руководство по макету кадра.

Края представления содержимого (ведущий, задний, верхний, нижний) не должны быть закреплены как ведущие на изображении - в Frame Layout Guide

Не так

но вот так - к Content Layout Guide.

Выберите Content Layout Guide из выпадающего

введите описание изображения здесь

И тогда большинство ответов будет работать для вас.

Самый простой подход сейчас выглядит так:

  1. Поместить вид прокрутки в корневой вид
  2. Прикрепите все стороны вида прокрутки к суперпредставлению
  3. Возьмите другой UIView (назовем его представлением содержимого) и поместите его в представление прокрутки.
  4. Прикрепите все стороны представления содержимого, чтобы прокрутить Руководство по макету содержимого представления.
  5. Прикрепите ширину представления содержимого, чтобы она равнялась руководству по компоновке кадра представления прокрутки.
  6. Фиксируйте высоту представления содержимого любым удобным вам способом (в приведенном ниже примере я использовал только ограничение постоянной высоты)

В целом ваша структура в простейшей реализации будет выглядеть так

введите описание изображения здесь

Хочу знать
источник
@WantToKnow Нет необходимости принимать ограничение по высоте, просто измените его приоритет на низкий (250)
Reckoner
Xcode 11+, Swift 5. Согласно ответу @WantToKnow, я решил свою проблему, я подготовил [video] [1] и [code] [2] [1]: youtube.com/watch?v=qMrH5_Yj5hM [2]: github.com/AhmAbdallah/CustomCollectionView
Ахмед Абдалла
1
Это отличный ответ, спасибо.
Константин
1
Это правильный ответ. Спасибо.
Винсент Джой
Это сработало для меня, только когда я добавил нижнее ограничение к последнему элементу представления контента
Д.Зотов
49

Вам необходимо создать UIViewкак подпредставление, UIScrollViewкак описано ниже:

  • UIViewController
  • UIView «Главный вид»
    • UIScrollView
      • UIView «Вид контейнера»
        • [Ваш контент]

Второй шаг - сделать UIScrollViewограничения. Я сделал это с верхним, нижним, ведущим и конечным ограничениями для его superView.

Затем я добавил ограничения для контейнера UIScrollViewи вот где начинается проблема. Когда вы накладываете те же ограничения (сверху, снизу, впереди и сзади), раскадровка выдает предупреждение:

«Имеет неоднозначную ширину прокручиваемого содержимого» и «Имеет неоднозначную высоту прокручиваемого содержимого»

Продолжайте действовать с теми же ограничениями, что и выше, и просто добавьте ограничения Equal Heightи Equal Widthк своему Контейнерному представлению по отношению к Основному представлению, а не к вашему UIScrollView. Другими словами, ограничения Контейнерного Представления связаны UIScrollViewс суперпредставлением.

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

Тьяго Монтейро
источник
2
Согласовано - я думаю, что добавление представления контейнера является лучшим и наиболее приемлемым решением.
Эндрю Эблинг
1
Это решение будет работать, когда у вас нет навигационной панели для управления.
Лина
27

Я была такая же проблема. Снимите этот флажок. Так как вы устанавливаете размер контента в коде. введите описание изображения здесь

Yodagama
источник
24

Я наконец понял это, надеюсь, это легче понять.

Вы часто можете обойти это предупреждение, добавив базовый UIView в представление прокрутки как «представление контента», как они упоминали, и сделайте его таким же размером, что и представление прокрутки, и в этом представлении содержимого задайте эти 6 параметров.

введите описание изображения здесь

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

Уильям Т.
источник
1
Вышеуказанное почти сработало для меня, так как я беспокоюсь о 3-х различных ширинах экрана (4/5, 6, 6+). Я установил равные значения ширины для просмотра контента и прокрутки. Вы правы, это дубликат, так как я уже сказал, что в представлении содержимого должно быть 0 начальных и конечных пробелов.
Стюарт П.
8
Вы можете установить равные ограничения ширины и высоты от представления содержимого до представления с прокруткой вместо постоянных значений. Это будет работать на всех разрешениях.
Кумар C
Я должен реализовать то же самое, так что вы можете помочь мне, что я должен установить одинаковую высоту и ширину для просмотра содержимого и прокрутки?
Урми
Возможно, стоит проверить, стоит ли вам это делать. Недавно я настроил imageView в виде прокрутки и смог обойтись, установив только 4 ограничения, показанные вверху, чтобы ошибка исчезла в Xcode 8.3
Уильям Т.
1
@Медь это было опубликовано более 3 лет назад. С тех пор они определенно улучшили раскадровки. Я тоже заметил, что теперь вы можете обойтись без просмотра контента. Я поправлю свой ответ.
Уильям Т.
16

Я знаю, что могу опоздать, но следующее решение решает такие проблемы без дополнительного кода , просто используя раскадровки:

Для просмотра содержимого вам необходимо установить ограничения для начальных / конечных / верхних / нижних пробелов для просмотра прокрутки, и это не изменит рамки просмотра содержимого , например:введите описание изображения здесь

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

Надеюсь это поможет.

Borzh
источник
7

Для меня добавление contentViewне очень работает, как предлагалось. Кроме того, это создает издержки из-за добавленного представления (хотя я не считаю это большой проблемой). Для меня лучше всего было просто отключить проверку неоднозначности для меня scrollView. Все хорошо выглядит, так что я думаю, что это нормально в простых случаях, таких как мой. Но имейте в виду, что, если другие ограничения для вашего scrollViewперерыва, Interface-Builder больше не будет предупреждать вас об этом.

введите описание изображения здесь

Ник Подратц
источник
5
Это просто удалит предупреждение и ничего не сделает для решения проблемы.
Предраг Манойлович
Вы. находятся. мой. герой. Не осознавал, что это существовало, и я рад найти его! Я пробовал «Проверять только позицию», которую вы ожидаете, я не знаю, проверять только позицию, но нет, она также допускает эту проблему с «размером контента». Должен пойти с "Никогда не проверять". Спасибо!
Дастин
Я думаю, что это правильный ответ, если вы создаете дочернее представление программно. Спасибо!
Флориан Куше
6

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

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/

Майк Симз
источник
3

См. Ниже: представление контента в вертикальной и горизонтальной горизонтальной прокрутке. вы получили ошибку неоднозначности, всегда проверяйте, что два добавленных в представление прокрутки из вашего представления контента: 1) .button space to container.2) конечный пробел до ограничения, выделенного на скриншоте,

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

введите описание изображения здесь

это может помочь вам.

Рави Кумар
источник
3

Я решил эту проблему для своего вида, используя «Устранить проблемы с автоматическим макетом»> «Добавить отсутствующие ограничения» для выбранного представления. введите описание изображения здесь

Следующие два ограничения решают мою проблему:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

в котором: трейлинг, низ - трейлинг, низ UIScrollView

Линь Дао
источник
Это сработало для меня, добавив ограничение «снизу». Теперь, когда я думаю об этом, это имеет смысл.
Серебряный Волк - Восстановить Монику
3

Используя contentView ( UView) в качестве контейнера внутри UIScrollView, ручки к краям ( top, bottom, trailing, leading) из надтаблицы ( UIScrollView) и contentViewдолжны иметь equalwidthи equalheightк надтаблице. Это ограничения. И вызов метода:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

Решенные проблемы для меня.

Спиридон Копикль
источник
3

Свифт 4+ подход:

1) Установите UIScrollView верхний, нижний, левый и правый поля на 0

2) Внутри UIScrollView добавьте UIView и установите верхние, нижние, ведущие, конечные поля равными 0 (равным полям UIScrollView).

3) Наиболее важной частью является установка ширины и высоты, где ограничение по высоте должно иметь низкий приоритет .

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}
Горечавка садику
источник
2

@Matteo Gobbi ответ идеален, но в моем случае скролл не может прокручиваться, я убираю « выровнять центр Y » и добавляю « height> = 1 », прокрутка становится прокручиваемой

ygweric
источник
2

Люди, которые борются с отсутствием прокрутки uiscrollview, просто устанавливают нижнее ограничение вашего представления контента с нижним макетом вашего последнего представления (который находится внутри вашего представления контента). Не забудьте снять ограничение по центру Y.

Остальные все ограничения такие же, как определено выше. Scrollview заботится только о том, чтобы получить максимальную высоту из его представления содержимого, и мы устанавливаем его как нижнее ограничение последнего представления, что означает, что scrollview автоматически изменит смещение содержимого.

В моем случае последнее представление было UILable без свойства lines = 0 (которое автоматически регулирует его высоту в зависимости от его содержимого), поэтому оно динамически увеличивало высоту uilable, и в итоге наша прокручиваемая область увеличивается, поскольку нижний макет uilable выравнивается по низу нашего представления содержимого, что заставляет scrollview увеличивать смещение контента.

Сиддеш Махадешвар
источник
2

Я сделал видео на YouTube
Scroll StackViews, используя только раскадровку в XCode

Я думаю, что 2 вида сценариев могут появиться здесь.

Вид внутри scrollView -

  1. не имеет внутреннего содержимого Размер (например UIView)
  2. имеет свой собственный размер содержимого (например, UIStackView)

Для просмотра с вертикальной прокруткой в ​​обоих случаях необходимо добавить следующие ограничения:

  1. 4 ограничения сверху, слева, снизу и справа.

  2. Равная ширина прокрутки (чтобы остановить горизонтальную прокрутку)

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

введите описание изображения здесь


Для представлений, которые не имеют внутренней высоты содержимого, необходимо добавить ограничение высоты. Представление будет прокручиваться только в том случае, если ограничение по высоте превышает высоту scrollView.

введите описание изображения здесь

Warif Akhand Rishi
источник
2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

Вывод:

введите описание изображения здесь

IAJ
источник
зачем вам ведущий ведущий, если у вас уже есть оставленный якорь?
ShadeToD
leftAnchor не может быть использован для этой цели, поэтому мы должны использовать LeadingAnchor для достижения того же ..
iAj
Вы использовали оба в своем примере.
ShadeToD
@ShadeToD позвольте мне проверить
iAj
2

В моем случае я получил проблему с неправильным размером контента и размером Ambiguity в iPad, но работал на iPhone. Я сделал следующие изменения в раскадровке, чтобы решить эту проблему.

  1. Добавьте вид прокрутки в UIView и добавьте ограничения впереди, сверху, сзади и снизу до 0,0,0,0.
  2. Установите высоту просмотра прокрутки в соответствии с требованиями, например. 100.
  3. Добавьте UIView для прокрутки и добавьте ограничения, ведущие, верхние, задние и нижние к 0,0,0,0 и выровняйте ограничения по центру (X) и центру (Y).
  4. Отмените выбор «Руководства по макету содержимого» в инспекторе размеров представления прокрутки.
Далджит Сира
источник
1

Вертикальная прокрутка

  1. Добавьте UIScrollView с ограничениями 0,0,0,0 для суперпредставления.
  2. Добавьте UIView в ScrollView с ограничениями 0,0,0,0 для суперпредставления.
  3. Добавьте такое же ограничение ширины для UIView в UIScrollView.
  4. Добавьте высоту в UIView.
  5. Добавьте элементы с ограничениями в UIView.
  6. Для элемента, ближайшего к нижней части, убедитесь, что он имеет ограничение к нижней части UIView.
Bitcon
источник
0

Что я сделал, это создал отдельный вид контента, как показано здесь.

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

UIScrollView добавляется в контроллер основного вида.

Программно я добавляю contentView, который связан через IBOutlet, к классу и устанавливаю contentView UIScrollView.

UIScrollView с ContentView через Интерфейсный Разработчик

Влад
источник
0

Я получаю ту же ошибку .. я сделал следующее

  1. Просмотр (SuperView)
  2. ScrollView 0,0 600 600
  3. UIView внутри ScrollView: 0,0 600 600
  4. UIView содержит вид изображения, метку

Теперь добавьте начальные / конечные / верхние / нижние для scrollView (2), а затем UIView (3).

Выберите View (1) и View (3), чтобы установить одинаковый рост и вес. Это решило мою проблему.

Я сделал видео, которое поможет:

https://www.youtube.com/watch?v=s-CPN3xZS1A

Винод Джоши
источник
0

[протестировано в XCode 7.2 и для iOS 9.2]

Что подавляло ошибки и предупреждения раскадровки для меня, так это установление внутреннего размера представления прокрутки и представления содержимого (в моем случае, стека) для Placeholder . Этот параметр находится в Инспекторе размеров в Раскадровке. И это говорит - Установка внутреннего размера времени разработки влияет только на представление при редактировании в Интерфейсном Разработчике. Представление не будет иметь этот собственный размер содержимого во время выполнения.

Итак, я полагаю, мы не ошибемся, установив это.

Примечание. В раскадровке я закрепил все края скроллвью в суперпредставлении и все края стека в скроллвью. В моем коде я установил значение translatesAutoresizingMaskIntoConstraints как ложное как для вида scrollview, так и для стека. И я не упомянул размер контента. Когда динамический рост стека увеличивается, ограничения, установленные в раскадровке, обеспечивают возможность прокрутки стека.

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

gtl_pm
источник
0

Если кто-то ведет себя так, что вы замечаете полосу прокрутки на правильных свитках, но контент не перемещается, этот факт, вероятно, стоит рассмотреть:

Вы также можете использовать ограничения между содержимым представления прокрутки и объектами вне представления прокрутки, чтобы обеспечить фиксированную позицию для содержимого представления прокрутки, в результате чего содержимое будет отображаться в виде прокрутки.

Это из документации Apple . Например, если вы случайно прикрепили верхний ярлык / кнопку / изображение / вид к виду за пределами области прокрутки (может быть, заголовок или что-то прямо над scrollView?) Вместо contentView, вы бы заморозили весь свой contentView на месте.

Дэйв Дж
источник
0

Как упоминалось в предыдущих ответах, вы должны добавить пользовательский вид в представление прокрутки:

Пользовательский вид - это ContentView, отмеченный на изображении

Добавьте все ваши подпредставления к представлению контента. В какой-то момент вы увидите, что представление содержимого прокрутки имеет неоднозначное предупреждение о размере содержимого, вам следует выбрать представление содержимого и нажать кнопку «Устранить проблемы с автоматической разметкой» (в правом нижнем углу макета IB) и выбрать «Добавить отсутствующие». ограничения ».

введите описание изображения здесь

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

supergegs
источник
0

Вам просто нужно убедиться, что есть способ создать непрерывную линию ограничений сверху вниз для прокрутки. [-XXX]

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

johnnyMac
источник
0

Если у вас все еще есть проблемы с UIScrollView, просто отключите направляющие макета содержимого (выберите ScrollView в xcode Interface Builder -> выберите инспектор размера на правой панели -> отмените выбор «Руководства по макету содержимого») или попробуйте выполнить следующие действия: xcode 11 scroll view layout - это может быть полезно для нового стиля верстки. Отлично работает на macOS 10.15.2, Xcode 11.3.1, для 05.02.2020

смотреть скриншот

Виктор Дошенко
источник
0

Использование Autolayout

Добавьте представление прокрутки в хорошо определенное представление, а затем добавьте представление стека в представление прокрутки

Добавьте ограничения сверху, слева, справа, снизу, по центру X и по центру Y из вида прокрутки и стека в соответствующие супер-виды

Убедитесь, что ограничения связаны из стекового представления с правильным суперпредставлением (scrollview), поскольку текущая настройка по умолчанию - добавить ограничение Align Top, а не ограничение Top Space.

Ахмед Элашкер
источник