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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Прикрепите верхнюю часть прокрутки к верхней части самого верхнего ребенка.
  2. И прикрепите дно к нижней части его самого нижнего ребенка.

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

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

Теперь есть способ сделать прокрутку UIScrollView не покидая Storyboard :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Выберите XIB-файл UIViewController. В «Identity Inspector» создателя интерфейса измените UIView на тип classа UIScrollView

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

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

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

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

 scrollviewName.contentSize = CGSizeMake(0, 650); 

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

Да, st3fan прав, свойство contentSize UIScrollView должно быть установлено. Но вы не должны отключать автоспуск для этой цели. Вы легко можете настроить 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», чтобы сообщить о неоднозначности макета.

Если есть много подпунктов, то это может быть «цепочка» ограничений: от верхнего до верхнего подсмотра, высоты и пробелы между подзонами и нижним подзором внизу, как в ответе Даняла Айтекина.

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

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

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

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

раскадровка

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

https://stackoverflow.com/a/19476991/1869369

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

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

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

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

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

5: Готово ~

  1. Добавить UIViewController
  2. В UIViewController ‘Attribute Inspector -> Simulated Metrics’ задан размер Freeform
  3. В UIViewController ‘Size Inspector -> View Controller’ установлена ​​высота 800
  4. Добавить UIScrollView в UIViewController
  5. Добавьте все ограничения в UIScrollView (сверху, влево, вправо, снизу) и добавьте выравнивание X = центр
  6. Добавить UIView в UIScrollView
  7. Добавьте все ограничения в UIView (сверху, влево, вправо, снизу) и добавьте выравнивание X = центр. Да, то же, что и для UIScrollView в # 3, но для UIView
  8. Добавьте ограничение высоты в UIView. Например, 780
  9. Бег

Раскадровка

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

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

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

Установите рамку для ScrollView.

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

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

  • Как настроить размер содержимого UIScrollView динамически
  • Интерфейс UIScrollViewBegan
  • Прокрутка двумя пальцами с помощью UIScrollView
  • UIScrollView не прокручивается после обновления до iOS7 / xcode 5
  • Прокрутка Не работает IOS 7
  • Как отключить горизонтальную прокрутку UIScrollView?
  • Пейджинг UIScrollView с шагом меньше размера кадра
  • Как я могу программно принудительно остановить прокрутку в UIScrollView?
  • Как прокрутить UITableView в определенную позицию
  • Прокрутка UITableView внутри UIScrollView
  • Отключить прокрутку UIScrollView, когда UITextField становится первым ответчиком
  • Interesting Posts

    Печать из браузера с помощью экрана CSS?

    Как создать пользовательские сочетания клавиш в vim?

    В чем разница между MongoTemplate и MongoRepository Spring Data?

    Как удалить пустую папку с помощью thumbs.db без отключения миниатюр

    Предел пропускной способности по порту на iptables

    Композитный первичный ключ или нет?

    Big-O для восьмилетних детей?

    Как создать хранилище ключей?

    Как использовать selenium webdriver на локальной (на моем компьютере) веб-странице вместо того, чтобы найти где-нибудь на www?

    Как запустить командный файл без запуска «командного окна»?

    Имя метода должно начинаться с findBy или findOneBy. Неопределенный метод Symfony?

    Интернационализация в JSF, когда использовать набор сообщений и набор ресурсов?

    Уникальный идентификатор приложения для iPhone

    Внутренний class может получить доступ, но не обновлять значения – AsyncTask

    Командная строка или пакетный cmd для конкатенации нескольких файлов

    Давайте будем гением компьютера.