UIScrollView Paging Autolayout & Storyboard
Есть много ответов, связанных с просмотром прокрутки с автозапуском и большим количеством прокрутки scrollview, но я не могу найти ни одной информации, которая обращается к обоим.
Я не пытаюсь сделать что-то фантастическое... просто 7
полноэкранные изображения, которые я бы прокрутил по горизонтали под пейджингом, но ради простоты (ха!) я решил попробовать все в раскадровке.
Контроллер установлен на свободный размер формы с шириной 2240 (320*7)
. Затем я настроил его так, как предлагает Apple для автоматического отключения...
UIScrollview
/-----UIView
/----------Content (7 image views)
В scrollview есть ограничения 0/0/0/0
для всех ребер, также как и UIView внутри.
Когда Paging Enabled выключен, он ведет себя красиво - точно так, как ожидалось. Но как только я включаю пейджинг, салфетки делают вид сумасшедшим, прокручивая всю ширину 2240
, а затем отскакивая назад и в конечном итоге высаживаясь на соответствующую страницу.
Я знаю, что у меня есть проверенный вариант, просто сломав все это и делая это программно, но мое упрямство хочет понять это. Это должно быть возможно!
Ответы
Ответ 1
У меня есть UIScrollView с пейджингом, а AutoLayout работает отлично. Вот моя настройка:
UIView // Main view
|---> Dummy UIView // See below
|---> UIScrollView
|---> Content UIView
|---> Page 1 Container
|---> Page 2 Container
Ограничения, которые я использовал
Dummy UIView -> Parent UIView
- это то, что я хочу, чтобы размер прокрутки пейджинга был, а UIScrollView -> Dummy UIView
- (0,0,0,0) со всех сторон. Это просто регулярный макет, который создает фиктивный UIView, где я хочу поместить scrollview и UIScrollView
, который полностью заполняет манекен UIView
.
Обратитесь к Technote от Apple для AutoLayout и UIScrollViews
: https://developer.apple.com/library/content/technotes/tn2154/_index.html
Содержимое внутри scrollview должно иметь собственный размер. Он не может полагаться на scrollview, чтобы получить его размер.
Как указано в TechNote, установите ограничения со всех четырех сторон Content View
на UIScrollView
до (0,0,0,0). Точные значения не имеют большого значения, поскольку все, что вы говорите, UIScrollView
заключается в том, что это представление, чтобы получить contentSize
из.
В этот момент Xcode будет жаловаться, что Content View
не имеет собственного размера. И вот трюк: здесь мы используем Dummy UIView
, который мы создали выше. Размер Dummy UIView
- это размер каждой страницы в UIScrollView
.
Таким образом, мы устанавливаем высоту Content UIView
равной высоте Dummy UIView
, а ширина Content UIView
равна количеству страниц, умноженному на ширину Dummy UIView
, используя AutoLayout. (Для более позднего изменения множитель в ограничении будет числом страниц).
Теперь создайте страницы внутри Content UIView
, как обычно, и установите Paging Enabled
на yes на вашем UIScrollView
и voila, у вас есть пейджинг в UIScrollView
, используя AutoLayout.
Я тестировал это в IOS 6, 7 и 8.
Update:
Вот пример проекта с этой настройкой в соответствии с запросом:
https://github.com/kostub/PagingScrollView
Ответ 2
Можно использовать размер scrollView для установки размера contentView, в отличие от https://developer.apple.com/library/ios/technotes/tn2154/_index.html; это было протестировано в iOS 8.2 beta 3.
Обратите внимание, что я сделал это программно, но, надеюсь, это кому-то полезно. Иерархия:
root: UIView
scrollView: UIScrollView
contentView: UIView
page0
page1
...
-
Добавьте ограничения для позиции scrollView относительно корня и любых братьев и сестер scrollView.
-
Присоедините стороны contentView к его супервину (scrollView):
"H: | [contentView] |"
"V: | [contentView] |"
-
Добавьте ограничения равенства по размеру в contentView и scrollView; это та часть, которая противоречит TN2154 (в которой говорится: "Не полагайтесь на вид прокрутки, чтобы получить их размер" ):
contentView.height == scrollView.height
contentView.width == scrollView.width
Примечание. Вышеуказанная нотация для запрограммированного ограничения высоты.
- Разместите страницы относительно их супервизора (contentView); Я сделал это, применив первую страницу слева/сверху к contentView слева/сверху и последующим страницам слева/сверху до предыдущей страницы справа/сверху.
Кредит "Кустову" за то, что он меня на правильном пути, - его решение работает, но с некоторой путаницей я смог устранить фиктивный вид.
Ответ 3
Следуйте Работа со списками прокрутки для создания подкачки UIScrollView с контентом в Interface Builder.
Я также рекомендую использовать Stack View в качестве содержимого для вашего UIScrollView, поскольку он позволяет существенно уменьшить сложность компоновки.
Когда вы используете традиционный подход, каждый вид представления внутри представления содержимого имеет 5 ограничений по крайней мере:
- предшествующий предыдущей записи
- top для родителя
- переход к следующей записи
- до родительского
- равная ширина для просмотра прокрутки
Stack View автоматически упорядочивает его содержимое, поэтому ограничение только должно иметь "равную ширину для прокрутки"
![Результат]()
Отметьте этот проект https://github.com/eugenebrusov/ios-stack-paging-scroll, чтобы увидеть "Вид стека" в действии.