Эта статья является второй частью, которая основывается на основах, которые были представлены в статье Создание собственного настраиваемого маршрутизатора представления с помощью SwiftUI (1 / X).
Во второй статье мы расширим основы из первой статьи о применении некоторых жестов к нашему проекту.
Жесты SwiftUI
Чтобы все заработало, нам нужно взглянуть на то, как работают жесты в SwiftUI. Это действительно довольно просто; мы в основном объявляем жест, например DragGesture
внутри модификатора .gesture()
.
Мы можем объявить DragGesture
либо без параметров, либо передать minimumDistance
и / или coordinateSpace
. Таким образом, мы можем создать жест с минимальным расстоянием перетаскивания и пространством координат местоположения жеста. coordinateSpace
может быть .local
, .global
или named()
. В этом примере мы используем .local
, поскольку хотим распознавать только локальный жест для каждого представления.
Расширение основ
Чтобы переключать представление на основе жеста, мы можем реализовать различные функции. Здесь мы развертываем функцию в нашем ViewRouter
перечислении для перехода к следующему или предыдущему представлению. Мы также могли бы реализовать оператор switch в каждом представлении, но это было бы ненужным повторением.
Таким образом, мы предоставляем функции, к которым можно получить доступ в наших представлениях, как мы уже ссылались на ViewRouter
.
Внедрение изменений
Мы начинаем вносить изменения в ViewRouter
в CustomPageView.swift
. Ранее мы уже ссылались на ViewRouter
, реализуя переменную @State
, которая содержит нашу текущую страницу. Мы расширяем наши переменные другой @State
переменной, которая содержит значение Bool
, называемое showSettings
. Позже мы будем использовать это, чтобы показать или скрыть представление настроек.
- Мы вводим еще одну переменную, которая содержит значение типа Bool. Это значение либо истинно, либо ложно, в соответствии с отображаемым или скрытым SettingsView.
- Мы расширили наши представления, так как они не принимают два параметра. Они принимают наш ViewRouter.page как привязку, а также showSettings как привязку. Как именно это реализовать, будет показано ниже.
- Представление настроек - единственное представление, которое отображается по-другому. Он показан в виде листа, что означает, что он скользит по нижнему краю.
Изменения, внесенные в отдельные представления
Как я сказал выше, нам также нужно немного изменить наши представления, чтобы не нарушать код.
- Мы объявляем нашу новую привязку так же, как и с
page
. - В этом простом примере мы изменяем наш
Text
с помощью жеста, который изменяется либоpage
, либоshowSettings
в зависимости от выполненного жеста. Для этого мы вводим модификатор.gesture()
вместе сDragGesture()
, как описано выше. Мы также хотим, чтобы какой-то код запускался после жеста, отсюда и модификатор.onEnded()
. - Затем мы определяем, что делать, на основе
value
, предоставленного жестом. На самом деле это довольно просто: если ширина меньше нуля, а высота находится где-то между -30 и 30, мы предполагаем смахивание влево. Затем мы хотим перейти на следующую страницу. Не запутайтесь со второй парой паразитов, нам нужно поместить их туда, потому что мы не создали экземпляр ViewRouter, а только ссылку на сам тип. - Последний шаг - установить для
showSettings
значение true, если мы проведем пальцем вверх.