Как использовать UIScrollView в Interface Builder?

В то время как я использовал UIScrollView успешно в прошлом, манипулируя им программно, у меня возникли проблемы с его работой, настроив его исключительно в Interface Builder.

У меня есть простая страница "about" в моем приложении для iPhone. Он имеет UITextView, некоторые значки и ссылки на мои другие приложения. Я добавил все эти представления в мой UIScrollView, упорядочив их так, чтобы их общий размер был > 480. Когда я запускаю свое приложение, scrollview отображает только содержимое, которое поместится на экране, и ничего не прокручивается.

Можно ли сделать это полностью через IB, или я должен манипулировать contentSize через код?

Ответ 1

Вы забыли установить свойство contentSize в UIScrollView. Как ни странно, вы не можете сделать это из Interface Builder. Вам нужно будет сделать это с контроллера просмотра, управляющего этим видом прокрутки.

Ответ 2

Ответ Boby_Wan заставил меня задуматься, и я нашел следующее решение для настройки UIScrollView contentSize из Interface Builder:

  • Выберите UIScrollView в сюжете раскадровки
  • Перейдите к инспектору Identity, создайте новый атрибут Runtime User Defined Runtime (нажмите кнопку +).
  • Измените атрибут Key Path на contentSize
  • Измените атрибут Type на Size
  • Теперь установите значение в { желаемую ширину содержимого, желаемую высоту содержимого}

например, установка значения в значение {320, 920} позволит пользователю прокручивать весь дополнительный экран на iPhone.

(Я использую xcode 4.3.3, цель развертывания iOS проекта равна 5.1)

Когда я впервые это сделал, я получил следующую ошибку:

Незаконная конфигурация:
      Тип размера пользовательских атрибутов времени выполнения с версиями Xcode до 4.3
      MainStoryboard.storyboard

Если вы тоже получите эту ошибку, это просто исправить: выберите Раскадровка в Навигаторе проектов и вызовите Инспектор Файлов. Найдите/разблокируйте раздел "Интерфейс компоновщика интерфейса", и для разработки есть раскрывающийся список. Убедитесь, что для этого параметра установлено значение Xcode 4.3

Ответ 3

С помощью Autolayout (iOS6 +) вы можете не устанавливать contentSize. Вместо этого установите следующие ограничения:

  • Вставьте верхнюю часть прокрутки в верхнюю часть своего самого верхнего ребенка.
  • И прикрепите нижнюю часть к нижней части своего самого нижнего ребенка.

Ответ 4

Вы можете сделать это, используя только Interface Builder, перейдите к Identity Inspector (вкладке третьего инспектора) и добавьте атрибут новый пользовательский Runtime с

  • Путь к ключу: contentSize
  • Тип: Размер
  • Значение: {ширина, высота}

Ответ 5

Теперь есть способ сделать прокрутку UIScrollView, не выходя из раскадровки:

  • Выберите UIScrollView в раскадровке, перейдите к размеру инспектор и изменить нижнее значение (или любое другое значение вам нужно изменить) в разделе "Вставки содержимого" на высоту области содержимого.
  • Теперь перейдите к инспектору Identity и создайте новый атрибут Runtime User Defined Runtime (нажав кнопку +) и назовите его contentSize. Неважно, какой тип или значение вы заполняете (вы даже можете оставить свое значение по умолчанию).

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

Ответ 6

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

Что не является очевидным очевидным в построителе интерфейса, вы можете иметь непривязанные представления, которые хранятся в nib, но не являются частью основного представления, в котором главным образом является nib.

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

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

во время выполнения, in - (void) viewDidLoad

scrollView.contentSize = scrollView.frame.size;
scrollView.frame = placeholder.frame;
[placeholder.superview addSubView:scrollView];
[placeholder removeFromSuperview];

в качестве альтернативы (если вы не использовали местозаполнитель):

CGRect f = self.view.frame;
scrollView.contentSize = f.size;
f.origin.x = 0;
f.origin.y = 0;
scrollView.frame = f;
[self.view addSubView:scrollView];

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

Ответ 7

В Xcode 4.5 с использованием Autolayout у меня нет раздела Content Insets в моем инспекторе размеров. Поэтому мне пришлось добавить его в соответствии с атрибутами Runtime User Defined Runtime, а затем он работал нормально.

То, что вы добавляете в "Атрибуты, определенные пользователем", - это keyPath == contentInset, который имеет тип "Rect" (UIEdgeInsets, который имеет тот же вход как Rect) и определяется как {верхний, левый}, {нижний, правильно}. ContentSize определяет только область окна scrollview. contentInset определяет прокручиваемую область.

Надеюсь, это поможет кому-то в той же ситуации.

Ответ 8

Многие из приведенных выше ответов являются вводящими в заблуждение или устаревшими. Начиная с 2017 года (возможно, намного раньше) построитель интерфейсов поддерживает прокрутки с содержимым с автоматическим размером. Хитрость заключается в том, что XCode дает специальное, нестандартное значение ограничениям между scrollview и содержимым внутри него. Эти "внутренние" ограничения фактически не влияют на размер контента, как вы могли бы ожидать.

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

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

Это совершенно неочевидно, потому что, когда вы идете установить ограничения, XCode всегда будет предлагать текущий интервал, и вам никогда не понадобится умышленное изменение ограничений, связанных с внешним и внешним видом, таким образом, что это конфликтует. Но вы можете, и они имеют значение, описанное выше: один управляет макетом scrollview, а один управляет размером области прокручиваемого содержимого.

Я случайно наткнулся на это, а затем посмотрев, как это работает, приведет меня к этой статье, которая полностью объясняет это и цитирует источник документов Apple для этого:

https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/

Последний критический фрагмент информации, о самоопределяемом размере контента: вы можете почувствовать, что вы находитесь в catch-22 здесь, потому что вы обычно делаете размер своего контента, например, ширина родительского представления, но в этом случае родительский элемент является прокруткой и, как описано выше, ограничение не влияет на размер вашего содержимого. Ответ здесь заключается в том, чтобы помнить, что вы можете ограничить элементы элементами, которые не являются непосредственно соседними в вашей иерархии представлений. Вы можете установить ширину вашего представления содержимого на ширину основного представления, а не пытаться напрасно получить прокруткуview, чтобы сделать это для вас.

Ответ 9

Если вы нажмете на значок "Свойства" любого контроллера просмотра в построителе интерфейсов, вы можете установить его в "Свободный формат" в "Имитированные показатели" и изменить размер основного представления как желаемого размера контента.

Таким образом вы можете создать свой контент ScrollView, как если бы это было одно большое представление. Поскольку это только смоделированная метрика, ваш View Controller будет изменен до границ окна при его загрузке.

Ответ 10

Настройка UIScrollView через Interface Builder не является интуитивным. Вот мой контрольный список для его настройки:

  • Выберите файл XIV UIViewController. В конструкторе интерфейса "Identity Inspector" измените UIView на тип класса UIScrollView

  • В разделе "Инспектор файлов" снимите флажок "Автоотключение"

  • В разделе "Attributes Inspector" измените размер на Freeform. Затем вы можете растянуть вид прокрутки вручную или указать пользовательскую ширину и высоту в разделе "Инспектор размеров".

  • В "Identity Inspector" добавьте новый атрибут Runtime, определенный пользователем, под названием "contentSize" типа "Размер" и измените его на значение, подобное {320, 1000}. Вы не можете установить это программно больше и, следовательно, нуждаетесь в этом шаге, чтобы Scroll View знал, что содержимое прокрутки больше, чем окно.

Ответ 11

Просто удалите autoLayout на вашем прокрутке. то код такой же простой, как это:

scrollviewName.contentSize = CGSizeMake(0, 650);

просто создайте свойство iboulet в файле .h, а затем синтезируйте файл .m. Убедитесь, что прокрутка включена.

Ответ 12

Да, st3fan правильно, должно быть установлено свойство UIScrollView contentSize. Но вы не должны отключать автоспуск для этой цели. Вы легко можете настроить contentSize для UIScrollView с автозапуском только в IB, без какого-либо кода.

Важно понимать, что при использовании autolayout contentSize UIScrollView не устанавливается напрямую, он вычисляется на основе ограничений всех подзадач UIScrollView. И все, что вам нужно, это обеспечить надлежащие ограничения для подсмотров для обоих направлений.

например. если у вас есть только одно подвью, вы можете установить его высоту и пространство сверху и снизу для супервизора (т.е. scrollView в нашем случае) contentSize.height рассчитывается как сумма

Vertical Space (aSubview.top to Superview.top) + aSubview.height + Vertical Space (aSubview.top to Superview.top)

contentSize.width вычисляется аналогично горизонтальным ограничениям.

Если слишком мало ограничений для вычисления contentSize должным образом, маленькая красная кнопка отображается рядом с элементом "Элемент View Controller", чтобы сообщить о неоднозначности макета.

Если существует много подзадач, тогда это может быть "цепочка" ограничений: от верхнего до верхнего подсмотра, высоты и пробелы между подзонами и нижняя часть поднабора внизу, как в Danyal Aytekin ответ.

Но на практике в большинстве случаев удобнее просто добавить пустой вид с требуемым размером и задать пробелы сверху, слева, внизу, справа от scrollView до 0. Вы можете использовать это представление как "просмотр содержимого", то есть поставить на него все другие субвью или если у вас уже много подзаголовков, и вы не хотите перемещать их и снова настраивать макет, вы можете добавить это вспомогательное представление к существующим subviews и сделать его скрытым.

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

Ответ 13

У вас может быть UIScrollView в StoryBoard с Autolayouts. В основном, что вам нужно:

  • Добавить UIScrollView
  • Добавьте к нему все ограничения (например, вставки сверху, слева, справа, снизу)
  • Добавьте UIView контейнера в UIScrollView
  • Если вам нужен только односторонний свиток (скажем, вертикальный): задайте высоту явно (для экземпляра, 600) и ширину ссылки на ширину UIScrollView.
  • Если вам нужна двунаправленная прокрутка, просто установите ширину и высоту.

storyboard setup

Ответ 14

Вот решение для разработки ScrollView с содержимым, большим, чем экран полностью в Storyboard (ну, почти полностью, вам нужно будет добавить еще одну строку кода)

fooobar.com/questions/53558/...

Ответ 15

Я узнаю более удобный способ.

1: масштабируйте размер прокрутки, чтобы содержать все ui внутри него.

2: добавьте iboutlet прокрутки.

3: В viewDidLoad сохраните frame.size прокрутки.
 (например, _scrollSize = _scrollView.frame.size;)

4: В viewWillAppear установите ContentSize с помощью CGSize, который вы сохранили ранее.
 (например, _scrollView.contentSize = _scrollSize;)

5: Готово ~

Ответ 16

  • Добавить UIViewController
  • В UIViewController 'Attribute Inspector → Имитированные метрики' заданный размер Freeform
  • В UIViewController 'Size Inspector → View Controller' задает высоту 800
  • Добавить UIScrollView в UIViewController
  • Добавьте все ограничения в UIScrollView (сверху, влево, вправо, внизу) и добавьте выравнивание X = center
  • Добавить UIView в UIScrollView
  • Добавьте все ограничения в UIView (верхний, левый, правый, нижний) и добавьте выравнивание X = центр. Да, то же, что и для UIScrollView в # 3, но для UIView
  • Добавьте ограничение высоты в UIView. Например, 780
  • Run

Раскадровка

Ответ 17

Создать новый проект Xcode

Перейдите к файлу Main.storyboard

Выберите ScrollView из библиотеки объектов.

Установить кадр для ScrollView.

Добавьте другой вид для просмотра с прокруткой и оставьте кадр таким же, как у ScrollView.

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