Пейджер, написанный на 100% кодом SwiftUI: от вертикальных и многостраничных страниц до каруселей.
Вступление
SwiftUI 2.0 уже здесь! После WWDC20 было объявлено о появлении множества новых API и функций в iOS 14. После всего лишь одного года существования Apple сделала ставку на эту платформу для поддержки основных функций своего нового выпуска iOS, таких как виджеты и клипы приложений. Это дает разработчикам возможность, которую мы так долго искали: предлог для начала внедрения представлений SwiftUI в наш производственный код.
Новое в iOS 14, TabView
поставляется с новым модификатором tabViewStyle
и PageTabViewStyle
. Это самый близкий к родному пейджеру в SwiftUI. Пагинация горизонтальная, одностраничная, и элементы занимают 100% фрейма своего контейнера:
В некоторых случаях это работает отлично, но как насчет более сложного поведения? Что, если бы мы выполнили какую-то операцию, когда появится третья страница? Можно частично показать боковые элементы? Все это и многое другое возможно с SwiftUIPager.
В следующих нескольких разделах я познакомлю вас с SwiftUIPager и раскрою его потенциал. Мы создадим приложение, которое поможет мне выбрать кошку. Я создал репозиторий для хранения конечного результата. Кроме того, я буду делиться ссылками на содержание в подписи к изображениям.
Базовый пейджер: Галерея кошек
Давайте создадим простую страничную прокрутку с помощью SwiftUIPager. Вам просто нужно использовать свой любимый менеджер пакетов и следовать инструкциям по установке. Также поддерживается ручная установка.
Примечание. хотя это руководство было написано с использованием Xcode 12b3, SwiftUIPager поддерживает iOS 13+. Если ваше приложение поддерживает более ранние версии iOS, см. Устаревшее руководство по установке.
Я использую Pager
, чтобы обернуть коллекцию AsynImage
для отображения изображений кошек из CatAPI:
Таким образом, нам удалось добиться того же поведения, что и при использовании TabView
. Однако SwiftUIPager предлагает гораздо больше.
Настройка Pager
Давайте немного настроим галерею:
Что тут происходит?:
vertical
превращаетPager
в вертикальный пейджер.interactive
добавляет красивый эффект масштабирования несфокусированным страницам.itemSpacing
добавляет некоторое пространство между элементами, аitemAspectRatio
изменяет размер страницы.padding
вставляет содержимое по оси без прокрутки.alignment(.justified)
сохраняет страницы в центре прокручиваемой области.
OnPageChanged
Вы заметили, что в этой галерее всего пять страниц? Это не поможет мне принять решение, я не могу выбрать подходящего кота, просто увидев пять картинок! Это потому, что конечная точка поиска CatAPI разбита на страницы, и мой ViewModel
запрашивает только пять элементов на страницу. Как мы можем быть уведомлены о переходе страницы? К счастью, Pager
поставляется с модификатором onPageChanged
для выполнения действия, когда новая страница находится в фокусе:
Я использую onPageChanged
здесь, чтобы запросить у моего ViewModel
дополнительные элементы, когда последний элемент будет в фокусе.
CatsFilters: множественная разбивка на страницы
В моей галерее слишком много кошек, и я не могу решить, какую выбрать. Мне нужно как-то их отфильтровать. CatAPI предлагает параметры запроса породы и категории для фильтрации результатов, поэтому я собираюсь создать новый View
, чтобы фильтровать моих кошек, для начала, по категории изображений. Как и следовало ожидать, SwiftUIPager здесь тоже очень поможет.
Милая! Модификаторы аналогичны тем, которые мы видели ранее, но в этом случае я использую preferredItemSize
, чтобы установить фиксированный размер страницы. Мой новый пейджер отображается красиво, но я заметил некоторые проблемы. Прокручивать такие маленькие элементы сложно, и отдельная разбивка на страницы выглядит не очень хорошо. Кроме того, количество категорий очень ограничено, и использование их в качестве эскизов не так хорошо, как можно было бы ожидать. Что, если мы превратим Pager
в карусель?
Вот что мы собираемся делать:
multiplePagination
заставитPager
прокручивать сразу несколько элементов.swipeInteractionArea(.allAvailable)
сообщитPager
, что доступны не только страницы, но и вся прокручиваемая область.loopPages(repeating: 2)
даст нам желаемый эффект карусели. Здесь я решил повторить элементы дважды. Это означает, чтоPager
объединит вторую партию элементов с исходным массивом, переданным при инициализации, что позволит более заманить разбиение на страницы.
Фильтрация пород: вращение 3D
Наконец, я хочу быть еще более конкретным при поиске нужного изображения, поэтому мы добавим новый фильтр - порода. В этом случае я представлю еще одну встроенную анимацию в SwiftUIPager: rotation3D
. С помощью аналогичного фрагмента кода и этого модификатора мы можем отобразить новый Pager
, чтобы обернуть доступные параметры:
Заключительный тест
Давайте запустим это на устройстве и увидим Pager
в действии:
Выводы
SwiftUIPager предлагает надежный пейджер для SwiftUI, который поставляется с несколькими модификаторами, чтобы сделать его еще более привлекательным. Мы рассмотрели некоторые из них в этом руководстве:
- Вертикальные пейджеры
- Запрос дополнительных товаров по запросу
- Интерактивные элементы
- Множественная разбивка на страницы
- Карусели
- 3D-эффект вращения
Но есть еще много чего. Остальное зависит от тебя.