Пока я использовал UIScrollView
в прошлом успешно его, манипулируя им программно, у меня возникли проблемы с его работой, настроив его исключительно в Interface Builder.
У меня в приложении для iPhone есть простая страница "О себе". В нем есть UITextView
несколько значков и ссылки на другие мои приложения. Я добавил все эти представления в свой UIScrollView
, расположив их так, чтобы их общий размер был> 480. Когда я запускаю свое приложение, в режиме прокрутки отображается только то содержимое, которое умещается на экране, и ничего не прокручивается.
Можно ли сделать это полностью через IB, или я должен управлять contentSize через код?
источник
contentSize
типаSize
и установив желаемое значение.contentSize
вид прокрутки на основе размеров его подвидов , по крайней мере, как поведение по умолчанию.Ответ Boby_Wan заставил меня задуматься, и я нашел следующее решение для настройки размера содержимого UIScrollView из Interface Builder:
UIScrollView
в сцене раскадровкиcontentSize
Size
например, установка значения на {320, 920} позволит пользователю прокрутить вниз весь дополнительный экран на iPhone.
(Я использую xcode 4.3.3, цель развертывания iOS проекта - 5.1)
Когда я впервые сделал это, я получил следующую ошибку:
Если вы тоже получаете эту ошибку, ее легко исправить: выберите раскадровку в навигаторе проекта и откройте инспектор файлов . Найдите / разверните раздел документа Interface Builder , там есть раскрывающийся список для разработки . Убедитесь, что это установлено на
Xcode 4.3
источник
"this class is not key value coding-compliant for the key keyPath"
могли бы вы помочь мне, что я делаю не так? обратите внимание, что я использую xamarin-ios-c #С помощью Autolayout (iOS6 +) вы можете избежать установки
contentSize
. Вместо этого установите следующие ограничения:источник
contentSize
не работает с Xcode 5 и iOS 7Вы можете сделать это, используя только Interface Builder, перейдите в Identity Inspector (третья вкладка инспектора) и добавьте новый пользовательский атрибут Runtime с
источник
Теперь есть способ сделать
UIScrollView
прокрутку, не выходя из раскадровки :UIScrollView
в раскадровке, перейдите в Инспектор размеров и измените нижнее значение (или любое другое значение, которое вам нужно изменить) во вкладках содержимого. » на высоту области содержимого.contentSize
. Неважно, какой тип или значение вы вводите (вы даже можете оставить их значение по умолчанию).Это заставит
UIScrollView
работать нормально, хотя я не знаю, зачем нужен второй шаг (узнал случайно). :(источник
один из подходов, которые я использовал в прошлом, - это перетащить scrollview из представления, содержащего представление, в построителе интерфейса и установить его фактический размер на то, что нужно для contentSize.
что по своей сути не очевидно в построителе интерфейсов, так это то, что у вас могут быть несвязанные представления, которые хранятся в пере, но не являются частью основного представления, для которого в первую очередь предназначено перо.
в представлении, в котором вы хотите, чтобы оно отображалось в scrollview, поместите простой UIView, который вы используете в качестве заполнителя. (это просто для того, чтобы вы могли визуально спроектировать его местоположение. Если вы просто используете все представление, вы можете пропустить этот шаг и использовать второй фрагмент кода, который я предоставил в конце этого ответа).
затем вы можете заполнить область прокрутки элементами управления, визуально расположив ее так, как вы хотите. предоставьте как заполнитель, так и свойства scrollview внутри вашего контроллера представления, чтобы вы могли получить к ним доступ во время выполнения.
во время выполнения, в - (void) viewDidLoad
в качестве альтернативы (если вы не использовали заполнитель):
наконец, если вы «потеряете» вид прокрутки в построителе интерфейса (его можно закрыть, чтобы он исчез из сетки дизайна), не паникуйте. просто щелкните по нему в списке объектов слева от сетки дизайна.
источник
В Xcode 4.5 с использованием Autolayout у меня нет раздела Content Insets в моем инспекторе размеров. Поэтому мне пришлось добавить его в пользовательские атрибуты времени выполнения, и тогда он работал нормально.
В «Пользовательские атрибуты времени выполнения» вы добавляете keyPath == contentInset типа «Rect» (UIEdgeInsets, который имеет тот же ввод, что и Rect) и определяется как {top, left}, {bottom, right}. ContentSize определяет только область окна scrollview. contentInset определяет прокручиваемую область.
Надеюсь, это поможет кому-то в такой же ситуации.
источник
Многие из приведенных выше ответов вводят в заблуждение или устарели. По состоянию на 2017 г. (возможно , гораздо раньше) интерфейс строитель делает поддержку scrollviews с содержанием автоматически размера. Хитрость в том, что XCode придает особое нестандартное значение ограничениям между просмотром прокрутки и содержимым внутри него. Эти «внутренние» ограничения не будут самом деле повлияют на размер содержимого, как вы могли бы ожидать.
Это означает, что вы можете, например, закрепить свой scrollview в нижней части основного представления с нулевым полем, а также закрепить содержимое вашего scrollview в нижней части scrollview с нулевым полем, но содержимое фактически не будет растягиваться при этом. Вместо этого контент получит свой размер, определяемый самостоятельно (подробнее см. Ниже), и это также будет размер прокручиваемой области в области просмотра.
Подумайте об этом так - существует асимметрия в ограничениях привязки к scrollview: ограничения от scrollview до «внешнего» (родительского) мира, как обычно, определяют размер и положение scrollview. Но ограничения «внутри» scrollview на самом деле устанавливают размер и положение прокручиваемой области scrollview, привязывая ее к содержимому.
Это совершенно неочевидно, потому что, когда вы перейдете к установке ограничений, XCode всегда предложит текущий интервал, и вам никогда не придет в голову намеренно изменить внутренние и внешние ограничения таким образом, чтобы это конфликтовало. Но вы можете, и они имеют значение, описанное выше: один контролирует макет прокрутки, а другой - размер прокручиваемой области содержимого.
Я наткнулся на это случайно, а затем, увидев, как это работает, привел меня к этой статье, которая полностью объясняет это и цитирует источник документации Apple для этого:
https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/
И последняя важная часть информации о самоопределяемом размере содержимого: вы можете почувствовать, что попали в ловушку-22, потому что вы обычно устанавливаете размер своего содержимого, например, по ширине родительского представления, но в этом случае родительский элемент - это scrollview и как описано выше - ограничение не повлияет на размер вашего контента. Ответ здесь состоит в том, чтобы помнить, что вы можете ограничить элементы элементами, не соседними напрямую в вашей иерархии представления: например, вы можете установить ширину вашего представления содержимого равной ширине основного представления вместо того, чтобы тщетно пытаться заставить прокрутку сделать это для тебя.
источник
Если вы щелкните значок «Свойства» любого контроллера представления в Interface Builder, вы можете установить для него размер «произвольной формы» в смоделированных показателях и изменить размер основного представления на желаемый размер содержимого.
Таким образом, вы можете создавать содержимое ScrollView, как если бы это было одно большое представление. Поскольку это всего лишь смоделированная метрика, размер вашего контроллера представления будет изменен до границ окна при загрузке.
источник
Настройка UIScrollView через Interface Builder не является интуитивно понятной. Вот мой контрольный список для его настройки:
Выберите файл XIB UIViewController. В «Инспекторе идентичности» конструктора интерфейсов измените UIView на тип класса UIScrollView
В разделе "Инспектор файлов" снимите флажок "Автоформат
В «Инспекторе атрибутов» измените размер на Freeform. Затем вы можете растянуть прокрутку вручную или указать произвольную ширину и высоту в «Инспекторе размеров».
В «Инспекторе идентичности» добавьте новый определяемый пользователем атрибут времени выполнения с именем «contentSize» типа «Размер» и измените его на значение, подобное {320, 1000}. Вы больше не можете установить это программно и, следовательно, вам нужен этот шаг, чтобы Scroll View знал, что содержимое Scroll View больше, чем окно.
источник
Просто удалите autoLayout из вашего scrollview. тогда код будет таким простым:
просто создайте свойство iboulet в файле .h, а затем синтезируйте его в файле .m. Убедитесь, что прокрутка включена.
источник
Да, st3fan прав, свойство contentSize UIScrollView должно быть установлено. Но отключать автопрокладку для этого не стоит. Вы легко можете настроить contentSize для UIScrollView с автоматическим размещением только в IB, без какого-либо кода.
Важно понимать, что при использовании автоматического размещения размер содержимого UIScrollView не устанавливается напрямую, он рассчитывается на основе ограничений всех подпредставлений UIScrollView. И все, что вам нужно, - это предоставить правильные ограничения для подвидов в обоих направлениях.
Например, если у вас есть только одно подпредставление, вы можете установить его высоту и пространство сверху и снизу до супервизора (т.е. scrollView в нашем случае) contentSize.height рассчитывается как сумма
contentSize.width рассчитывается аналогично из горизонтальных ограничений.
Если слишком мало ограничений для правильного расчета contentSize, рядом с элементом View Controller Scene отображается маленькая красная кнопка, чтобы сообщить о неоднозначности макета.
Если есть много подвидов , то это может быть «цепь» ограничения: сверху верхний подвид, высоту и пространство между подвидами и нижним подвидом вниз , как в Danyal Айтекин ответа.
Но на практике в большинстве случаев удобнее просто добавить пустое представление с требуемым размером и установить пробелы сверху, слева, снизу, справа от scrollView на 0. Вы можете использовать это представление как «представление содержимого», т.е. поместить все остальные подвиды на нем или если у вас уже есть много подпредставлений и вы не хотите их перемещать и заново настраивать макет, вы можете добавить это вспомогательное представление к существующим подпредставлениям и сделать его скрытым.
Чтобы сделать scrollView прокручиваемой, вычисляемый размер содержимого должен быть больше размера scrollView.
источник
У вас может быть UIScrollView в StoryBoard с Autolayouts. В основном вам нужно:
источник
Вот решение для разработки ScrollView с содержимым, превышающим размер экрана, полностью в Storyboard (ну, почти полностью, вам также нужно добавить одну строку кода)
https://stackoverflow.com/a/19476991/1869369
источник
Нахожу более удобный способ.
1: масштабировать размер прокрутки так, чтобы внутри нее находился весь пользовательский интерфейс.
2: Добавить iboutlet для просмотра прокрутки.
3: В viewDidLoad сохраните размер кадра прокрутки.
(например, _scrollSize = _scrollView.frame.size;)
4: В viewWillAppear установите contentSize на CGSize, который вы сохранили ранее.
(например, _scrollView.contentSize = _scrollSize;)
5: Готово ~
источник
источник
Создать новый проект Xcode
Перейдите к файлу Main.storyboard
Выберите ScrollView из библиотеки объектов.
Установите рамку для ScrollView.
Добавьте другое представление для прокрутки и оставьте фрейм таким же, как у ScrollView.
Теперь, чтобы установить его высоту и ширину динамически, вы можете настроить UIScrollView с помощью автоматического макета в XIB.
источник