Как мне использовать UIScrollView в Интерфейсном Разработчике? - PullRequest
95 голосов
/ 16 июля 2009

Хотя в прошлом я успешно использовал UIScrollView, манипулируя им программно, у меня возникли проблемы с его настройкой, поскольку он был настроен исключительно в Интерфейсном Разработчике.

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

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

Ответы [ 17 ]

130 голосов
/ 16 июля 2009

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

113 голосов
/ 28 июня 2012

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

  1. Выберите UIScrollView в сцене Раскадровки
  2. Перейдите в Инспектор удостоверений , создайте новый Определяемый пользователем атрибут времени выполнения (нажмите кнопку +)
  3. Изменить атрибут Путь ключа на contentSize
  4. Изменить атрибут Тип на Size
  5. Теперь установите Значение на { желаемую ширину содержимого , желаемую высоту содержимого }

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

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

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

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

Если вы тоже получаете эту ошибку, ее легко исправить: выберите раскадровку в Project Navigator и вызовите инспектор файлов . Найдите / разверните раздел Interface Builder Document , и есть раскрывающийся список для Development . Убедитесь, что установлено значение Xcode 4.3

25 голосов
/ 19 апреля 2013

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

  1. Прикрепите верхнюю часть вида прокрутки к вершине самого верхнего дочернего элемента.
  2. И прикрепите нижнюю часть к нижней части самого нижнего ребенка.
18 голосов
/ 21 сентября 2012

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

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

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

  1. Выберите UIScrollView в раскадровке, перейдите к размеру инспектор и измените значение Bottom (или любое другое значение необходимо изменить) в разделе Вкладки содержимого на высоту области содержимого.
  2. Теперь перейдите к Инспектор идентификации и создайте новый Определенный пользователем атрибут времени выполнения (нажав кнопку +) и назовите его contentSize. Не имеет значения, что Тип или Значение , которое вы вводите (вы даже можете оставить их значение по умолчанию).

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

4 голосов
/ 17 января 2013

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

То, что вы добавляете в «Определенные пользователем атрибуты времени выполнения», это keyPath == contentInset, который имеет тип «Rect» (UIEdgeInsets, который имеет тот же вход, что и Rect) и определяется как {top, left}, {bottom, право}. ContentSize определяет только область окна прокрутки. contentInset определяет прокручиваемую область.

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

4 голосов
/ 14 августа 2012

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

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

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

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

во время выполнения, в - (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];

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

4 голосов
/ 24 июля 2017

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

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

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

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

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

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

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

2 голосов
/ 29 июля 2013

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

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

2 голосов
/ 31 августа 2013

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

  1. Выберите XIB-файл UIViewController. В «Инспекторе идентичности» конструктора интерфейса измените UIView на тип класса UIScrollView

  2. В разделе «Инспектор файлов» снимите флажок Autolayout

  3. В разделе «Инспектор атрибутов» измените размер на «Свободная форма». Затем вы можете растянуть представление прокрутки вручную или указать произвольную ширину и высоту в «Инспекторе размеров».

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

...