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

Примечание. Вышеуказанная нотация для запрограммированного ограничения высоты.

  1. Разместите страницы относительно их супервизора (contentView); Я сделал это, применив первую страницу слева/сверху к contentView слева/сверху и последующим страницам слева/сверху до предыдущей страницы справа/сверху.

Кредит "Кустову" за то, что он меня на правильном пути, - его решение работает, но с некоторой путаницей я смог устранить фиктивный вид.

Ответ 3

Следуйте Работа со списками прокрутки для создания подкачки UIScrollView с контентом в Interface Builder.

Я также рекомендую использовать Stack View в качестве содержимого для вашего UIScrollView, поскольку он позволяет существенно уменьшить сложность компоновки.

Когда вы используете традиционный подход, каждый вид представления внутри представления содержимого имеет 5 ограничений по крайней мере:

  • предшествующий предыдущей записи
  • top для родителя
  • переход к следующей записи
  • до родительского
  • равная ширина для просмотра прокрутки

Stack View автоматически упорядочивает его содержимое, поэтому ограничение только должно иметь "равную ширину для прокрутки"

Interface Builder Результат

Отметьте этот проект https://github.com/eugenebrusov/ios-stack-paging-scroll, чтобы увидеть "Вид стека" в действии.