Как использовать UIScrollView в раскадровке

У меня есть вид прокрутки с контентом высотой 1000 пикселей, и я хотел бы иметь возможность выложить его для легкого дизайна раскадровки.
Я знаю, что это можно сделать программно, но я действительно хочу видеть это визуально. Каждый раз, когда я помещаю представление прокрутки в контроллер представления, оно не будет прокручиваться. Можно ли заставить его работать так, как я хочу, или я должен делать это в коде?

 Alex Reynolds04 апр. 2017 г., 15:25
Вот я снова через 2 года все еще получаю комментарии о том, как это не работает, или лучше делать автопоставку. Первоначальный вопрос заключался в том, как это сделать в ios 5/6. В эти дни я использую только autolayout, так что вы должны / можете тоже. Смотрите ответы на autolayout для помощи. Пожалуйста, Upvote autolayout ответы, если они полезны. Всем спасибо
 Alex Reynolds27 апр. 2015 г., 22:44
Привет всем, пожалуйста, смотрите комментарии ниже для новых способов сделать это. Я написал это 2 года назад, и xCode сильно изменился. Есть другие способы сделать это сейчас, так что будьте внимательны. Решения для iOS 7 и iOS 8, предложенные в комментариях

Ответы на вопрос(16)

не нужно указывать высоту вообще! Что хорошо, если он меняется по какой-либо причине (вы изменяете размеры компонентов или меняете размеры шрифта).

Я просто следовал этому уроку, и все работало:http://natashatherobot.com/ios-autolayout-scrollview/

(Примечание: нет необходимости реализовывать viewDidLayoutSubviews, если вы не хотите центрировать вид, поэтому список шагов еще короче).

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

лучше всего использовать UITableViewController со статическими ячейками в раскадровке.

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

что если бы у меня был View внутри UIScrollView на ViewController размером с FreeForm, он бы не прокручивал приложение, независимо от того, что я делал. Я поиграл и обнаружил, что, похоже, работает следующее, которое не использует FreeForms:

Вставьте UIScrollView внутри основного представления ViewController

Установите ограничения Autolayout на ScrollView соответствующим образом. Для меня я использовал руководство по макету от 0 до Top и руководство по макету от 0 до Top

Внутри ScrollView поместите контейнерный вид. Установите его высоту на то, что вы хотите (например, 1000)

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

Добавьте строку [self.scrollView setContentSize: CGSizeMake (320, 1000)]; в ViewController, который содержит scrollView (который вы подключили как IBOutlet)

ViewController (добавляется автоматически), связанный с контейнером, будет иметь желаемую высоту (1000) в Интерфейсном Разработчике, а также будет правильно прокручиваться в исходном контроллере представления. Теперь вы можете использовать ViewController контейнера для разметки ваших элементов управления.

 ToolmakerSteve29 мар. 2017 г., 05:36
Я проголосовал за этот ответ, потому что мне нравится техника; однако я считаю, что вы ошибаетесь в том, что FreeForm VC мешает прокрутке, независимо от версии iOS. Начиная с iOS 6 (который добавил Auto Layout), полный набор ограничений, как описано в других ответах,будем прокрутки. Я не думаю, что FreeForm мешает этому (хотя я не пробовал). Возможно, вы упустили какое-то неочевидное ограничение; ScrollView + AutoLayout - это что-то вроде хака.

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

ДляUIScrollViewМне нравится предложение Алекса, но я бы порекомендовалвременно изменив контроллер представления на произвольную форму, увеличив высоту корневого представления, построив пользовательский интерфейс (шаги 1-5), а затем изменив его обратно на стандартный размер вывода, когда вы закончите, чтобы вам не приходилось жестко кодировать размеры содержимого в в качестве атрибутов времени выполнения. Если вы сделаете это, вы откроете для себя множество проблем с обслуживанием, пытаясь поддерживать как 3,5-дюймовые, так и 4-дюймовые устройства, а также возможность увеличения разрешения экрана в будущем.

Вот шаги, которые работали для меня на iOS 7 и XCode 5.

Перетащите ViewController (он поставляется с UIView «View»).

1.1 Выберите «View Controller», выберите «File Inspector» и снимите флажок «Auto layout».

Перетащите ScrollView (как потомок UIView ViewController "View")Выберите ScrollView и откройте «Identity Inspector».

Введите «contentSize» для keyPath. Выберите «Размер» для Типа. И введите{320, 1000} для значения.

Примечание. Шаг 4 просто говорит о том, что скроллер содержит некоторый контент, размер которого составляет 320x1000 единиц. Поэтому настройка contentSize заставит работать скроллер.

Выберите View Controller, выберите «Инспектор атрибутов», затем выберитеСвободная форма от размера.

Примечание: шаг 5 позволит нам изменить размер «View», который поставляется с контроллером представления.

Выберите «Вид», а затем «Инспектор размеров».

Установите ширину до 320 и высоту до 1000.

Примечание: 5, 6 и 7 чисто для насвидеть растянутое или полное расширенное представление внутри StoryBoard. Примечание. Обязательно снимите флажок «Авторазметка» в View Controller.

Ваша иерархия View должна выглядеть так:

 Chris Harris30 окт. 2014 г., 19:14
Этот метод все еще работает с Xcode 6.1 и iOS 8.1.
 fabio.geraci11 апр. 2014 г., 14:19
Спасибо, работало просто отлично
 StefMa18 дек. 2014 г., 11:44
Муч лучше ответить .. Спасибо!
 Shanker Kaura10 дек. 2014 г., 23:41
Удивительно. Спасибо за это. Определенно работает на Xcode 6.1 и iOS 8.1, как уже упоминалось.
 PostCodeism17 дек. 2014 г., 21:56
Хорошо ... так что если нам НУЖНО автопоставка?

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

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

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

Auto Layout это работало для меня на XCode 8.2.1.

ВыбратьSize Inspector изView Controllerи изменитьSimulated Size вFreeform с высотой1000 вместоFixed.Переименовать видView Controller какRootView.ПеретащитеScroll View как подвидRootView и переименуйте его какScrollView.Добавить ограничения дляScrollView:ScrollView[Top, Bottom, Leading, Trailing] =RootView[Верх, низ, ведущий, трейлинг]ПеретащитеVertical Stack View как подвидScrollView и переименуйте его какContentView.Добавить ограничения дляContentView:ContentView.height =1000ContentView[Top, Bottom, Leading, Trailing, Width] =ScrollView[Верх, низ, ведущий, трейлинг, ширина]ВыбратьAttributes Inspector изContentViewи изменитьDistribution вFill Equally вместоFill.ПеретащитеView как подвидContentView и переименуйте его какRedView.УстановленRed в качестве фонаRedView.ПеретащитеView как подвидContentView и переименуйте его какBlueView.УстановленBlue в качестве фонаBlueView.ВыбратьRootViewи нажмитеUpdate Frames кнопка.Update Frames это новая кнопка в Xcode8, вместоResolve Auto Layout Issues кнопка. Это похоже на кнопку обновления, расположенную на панели управления под раскадровкой:

Посмотреть иерархию:

RootViewScrollViewContentViewRedViewBlueView

Просмотр сцены контроллера (высота: 1000):

Запустите на iPhone7 (высота: 1334/2):

 G.Abhisek21 дек. 2015 г., 07:40
Но дело в том, что внизу для ipad будет пустое место
 Changerrs28 июл. 2017 г., 22:23
просто любопытно, почему вы используете вертикальный вид стека вместо обычного UIView?
 jqgsninimo31 июл. 2017 г., 02:39
@Changerrs я используюUIStackView чтобы избежать проблем с установлением ограничений.
 GalaxyVintage14 окт. 2015 г., 06:39
у меня та же проблема, и мне интересно, будет ли это работать, если мой scrollview не имеет размер rootview?
 Krøllebølle05 мар. 2017 г., 12:51
Примечание для настройкиBlueViewверх кRedViewдно для начинающих, как я (Xcode 8.2): 1) ПеретащитеBlueView ниже RedView (т.е. они не должны пересекаться или шаг 4) не будет работать). 2) Откройте меню контактов внизу. 3) Нажмите на маленькую стрелку справа от ограничения верхнего поля. 4) ВыберитеRedView из этого меню и установите значение 0. Это отличается от предыдущих версий XCode, где вы могли бы сделать что-то вродеEditor ->Pin -> ...

Это часто отсутствует и не указывается при добавлении UIScrollView.

Выберите UIScrollView и выберите Identity Inspector.

ДобавитьcontentSize keyPath какsize в scrollView в Инспекторе идентификации и установите его в (320, 1000).

Прокрутите прочь

 ToolmakerSteve29 мар. 2017 г., 05:47
Это один из подходов, и я использовал его сам. Однако я не считаю это предпочтительным подходом. Это «чище / более гибко», чтобы предоставить полный набор ограничений, так что автоматическое расположение может вычислять сам размер контента. Три альтернативы:сверху-вниз-ограничений , или жеиспользовать вид стека, или жеограничить положение нижнего элемента.

ре. И я все еще использую (без всякой причины) относительно старую версию Xcode 4.6.1.

Начните с контроллера представления, у которого есть представление прокрутки по нему (основной вид).

1: Добавить представление контейнера из библиотеки объектов в представление прокрутки. Обратите внимание, что в раскадровку добавлен новый контроллер представления, и он связан с контроллером представления с представлением прокрутки.

2: Выберите вид контейнера и в инспекторе размеров установите привязку к верху и влево без автоматического изменения размера.

3: Измените его высоту на 1000. (1000 используется для этого примера. Вы должны применить требуемое значение.)

4. Выберите новый контроллер представления и в инспекторе атрибутов измените размер на произвольную.

5: Выберите представление нового контроллера представления и, на размер инспектора, измените высоту на 1000 (что равно высоте представления контейнера).

6: для вашего теста позже, пока он еще находится в представлении нового контроллера представления, добавьте метку вверху и внизу представления.

7: Выберите вид прокрутки в исходном контроллере вида. В инспекторе удостоверений добавьте атрибут с параметром keyPath, равным contentSize, типом, равным размеру, и значением, равным {320, 1000} (или размером вашего контейнера).

8: Запустите на 4-дюймовом iPhone Simulator. Вы должны быть в состоянии прокрутить от верхней метки до нижней метки.

9: Запустите на 3,5-дюймовом iPhone Simulator. Вы должны быть в состоянии прокрутить от верхней метки до нижней метки.

Помните, что Xcode 4.6.1 может собираться только для iOS6 и ниже. Используя этот подход и построение для iOS6, я все еще могу достичь тех же результатов, когда приложение работает на iOS7.

как в следующем примере:

- (void)viewDidAppear:(BOOL)animated{

     [super viewDidAppear:animated];
     self.scrollView.contentSize=CGSizeMake(306,400.0);

}

Он решает проблемы с автопоставкой и отлично работает на iOS7.

 ToolmakerSteve29 мар. 2017 г., 05:10
НОТА:Алекс Заватоне дает альтернативный способ установки contentSize, без написания кода.
Решение Вопроса

потому что я потратил 2 часа, чтобы найти решение, и StackOverflow позволяет этот стиль QA.

Начните заканчивать здесь, как заставить это работать в раскадровке.

1: перейдите к просмотру контроллера и нажмитеAttribute Inspector.

2: изменить размер наFreeform вместо Inferred.

3: Перейдите к основному представлению на этой раскадровке, а не к просмотру прокрутки, а к представлению верхнего уровня.

4: НажмитеSize Inspector и установите этот вид на нужный вам размер. Я изменил свой рост до 1000.

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

5: перетащите на прокрутку и растяните ее так, чтобы она занимала весь вид. Теперь у вас должно быть представление прокрутки размером 320,1000, которое будет отображаться в вашем контроллере представления.

Теперь нам нужно заставить его прокручиваться и правильно показывать контент.

6: Нажмите на свой прокрутки и нажмите наIdentity Inspector.

7: ДобавитьUser Defined runtime attribute с KeyPath изcontentSize затем введите РАЗМЕР и введите размер вашего контента. Для меня это (320, 1000).

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

8: Добавитьruntime attribute с KeyPathframe с типом RECT и 0,0,320,416.

Теперь, когда мы запустим наше приложение, у нас будет видимый вид прокрутки с кадром 0,0 320, 416 и прокруткой вниз до 1000. Мы можем расположить наши подпредставления и изображения и тому подобное в раскадровке так, как мы хотим, чтобы они отображались. Тогда наши атрибуты времени выполнения гарантируют правильное отображение. Все это без 1 строки кода.

 ChuckKelly03 дек. 2013 г., 00:59
не работает в ios7
 Raja Rao16 июн. 2014 г., 02:27
ПРИМЕЧАНИЕ: решение для iOS7 ниже stackoverflow.com/a/22489795/1553014
 T.Coutlakis19 апр. 2015 г., 18:27
Примечание: для iOS 8.3 XCode 6.3 ответ здесь:stackoverflow.com/questions/26742230/...
 Tronix11722 авг. 2013 г., 17:43
Если вы правильно используете функцию автоматического изменения размера прокрутки, вам не нужно определятьframe приписывать. Действительно, все устройства не имеют одинакового размера (iPhone 5).
 Alex Reynolds03 дек. 2013 г., 01:22
Если у вас есть решение для iOS 7, дайте мне знать. Этот ответ был опубликован более года назад до выхода iOS 7. Я заболел, иначе я бы обновил его для iPhone5 и ios7

Начало прокрутки для работы в iOS7 и Auto-layout в iOS 7 и XCode 5.

В добавок к этому:https://stackoverflow.com/a/22489795/1553014

По-видимому, все, что нам нужно сделать, это:

Установите для всех ограничений вид прокрутки (т.е. сначала исправьте вид прокрутки)

Затем установите ограничение distance-from-scrollView на самый нижний элемент для просмотра с прокруткой (который является суперпредставлением).

Примечание. Шаг 2 расскажет раскадровке, где последний фрагмент контента находится в представлении прокрутки.

который дает то же решение для вертикальной прокрутки, но (вопреки духу stackoverflow) не отвечает на вопрос. Вместо использования scrollView, просто используйте UITableView, перетащите обычный UIView в заголовок и сделайте его настолько большим, насколько вы хотите, теперь вы можете прокручивать контент в раскадровке.

 ToolmakerSteve29 мар. 2017 г., 03:35
ИМХО, это хороший ответ, а не вопреки идеалу stackoverflow, предлагать альтернативный подход (если OP специально не говорит, что им нужно делать это так, как они просят). И самое большое значение stackoverflow помогает всемДругие люди, которые приходят и читают вопросы и ответы. :)

я изучал тему в течение 2 дней и, наконец, нашел решение, которое я буду использовать всегда с этого момента

перейти к пункту 4 в принятом ответе и забыть о добавлении атрибутов фреймов, размеров и т. д.

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

на ios 7 все понятно, просто, элегантно и работает как шарм. я очень доволен всем этим

 jungle_mole18 нояб. 2017 г., 05:58
@BorisGafurov не слишком устарел с ios7 в любом случае. и м.б. это не в линию, но я уверен, что это помогло пару человек в любом случае .. так что пусть это будет
 ToolmakerSteve29 мар. 2017 г., 05:11
 Boris Gafurov18 нояб. 2017 г., 03:50
Ваше решение (если вы переходите по ссылке до конца) включает добавление строки кода, так что это не совсем соответствует вопросу - использование только раскадровки

Если вы развертываете свое приложение на устройствах ios 9, используйтевид стека, Вот шаги: -

Добавить представление прокрутки с ограничениями - закрепить слева, справа, снизу, сверху (без полей) в суперпредставлении (просмотр)Добавьте представление стека с теми же ограничениями для просмотра с прокруткой.Другие ограничения стека: - stackView.bottom = view.bottom и stackView.width = scrollView.widthНачните добавлять свои взгляды. Представление прокрутки решит прокрутить на основе размера представления стека (который по сути является вашим представлением содержимого)
 ToolmakerSteve29 мар. 2017 г., 05:19
Это полезный метод, который минимизирует количество ограничений, которые вы должны добавить вручную. В общем случае способ прокрутки состоит в том, чтобы обеспечить наличие достаточных ограничений для автоматической разметки для расчета размера содержимого. Вид стека делает большую часть этого ограничения для вас. Установить стекspacing поставить некоторое пространство между подпредставлениями (детьми). Если вам нужно больше места между двумя подпредставлениями, добавьте дочерний элемент «spacer»: прозрачный UIView с фиксированным размером.

стить содержимое в просмотры прокрутки, которые «за кадром». Протестировано с XCode 5 и iOS 7. Вы можете сделать это почти полностью в раскадровке, используя два небольших трюка / обходного пути:

Перетащите viewcontroller на вашу раскадровку.Перетащите scrollView на этот viewController, для демонстрации вы можете оставить его размер по умолчанию, охватывающий весь экран.Теперь приходиттрюк 1 : перед добавлением любого элемента в scrollView перетащите в обычном «представлении» (это представление будет сделано больше, чем экран, и будет содержать все подэлементы, такие как кнопки, метки, ... давайте назовем его «закрывающий вид«).Пусть эторазмер Y вмещающего представления в размере инспектора, например, до 800.Поместите метку на охватывающий вид, где-то в позиции Y 200, назовите ее «метка 1».Трюк 2 : убедитесь, чтозакрывающий вид выбран (не скроллвью!), и установите его положение Y, например, -250, чтобы вы могли добавить элемент, который находится «за пределами» экранаВставьте ярлык где-то внизу экрана, назовите его «ярлык 2». Этот ярлык на самом деле «за кадром».Сбросьте позицию Y вмещающего вида на 0, вы больше не увидите метку 2, так как она была расположена вне экрана.

Что касается работы с раскадровкой, теперь вам нужно добавить одну строку кода в метод viewController 'viewDidLoad', чтобы установить содержимое scrollViews, чтобы оно содержало весь «включающий вид». Я не нашел способ сделать это в раскадровке:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView.contentSize = CGSizeMake(320, 800);
}

Вы можете попробовать сделать это, добавивcontentSize keyPath какsize в scrollView в Инспекторе идентификации и установите его в (320, 1000).

Я думаю, что Apple должна сделать это проще в раскадровке, в TableViewController вы можете просто прокрутить закадровый экран в раскадровке (просто добавьте 20 ячеек, и вы увидите, что вы можете просто прокрутить), это также возможно с ScrollViewController.

 jaxvy12 февр. 2014 г., 17:20
Работает только с отключенным автоматическим макетом
 veeresh kumbar25 апр. 2018 г., 13:53
Как насчет динамического изменения размера контента, потому что все iPhone имеют разные размеры
 Ronny Webers15 мар. 2014 г., 22:13
это правильно, когда я недавно перенес свое приложение для поддержки автоматической разметки, я заменил представление прокрутки на статическое табличное представление. Выполняет ту же работу и имеет некоторые дополнительные преимущества.

Ваш ответ на вопрос