Эта статья является второй частью, которая основывается на основах, которые были представлены в статье Создание собственного настраиваемого маршрутизатора представления с помощью 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. Позже мы будем использовать это, чтобы показать или скрыть представление настроек.

  1. Мы вводим еще одну переменную, которая содержит значение типа Bool. Это значение либо истинно, либо ложно, в соответствии с отображаемым или скрытым SettingsView.
  2. Мы расширили наши представления, так как они не принимают два параметра. Они принимают наш ViewRouter.page как привязку, а также showSettings как привязку. Как именно это реализовать, будет показано ниже.
  3. Представление настроек - единственное представление, которое отображается по-другому. Он показан в виде листа, что означает, что он скользит по нижнему краю.

Изменения, внесенные в отдельные представления

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

  1. Мы объявляем нашу новую привязку так же, как и с page.
  2. В этом простом примере мы изменяем наш Text с помощью жеста, который изменяется либо page, либо showSettings в зависимости от выполненного жеста. Для этого мы вводим модификатор .gesture() вместе с DragGesture(), как описано выше. Мы также хотим, чтобы какой-то код запускался после жеста, отсюда и модификатор .onEnded().
  3. Затем мы определяем, что делать, на основе value, предоставленного жестом. На самом деле это довольно просто: если ширина меньше нуля, а высота находится где-то между -30 и 30, мы предполагаем смахивание влево. Затем мы хотим перейти на следующую страницу. Не запутайтесь со второй парой паразитов, нам нужно поместить их туда, потому что мы не создали экземпляр ViewRouter, а только ссылку на сам тип.
  4. Последний шаг - установить для showSettings значение true, если мы проведем пальцем вверх.