Позвольте пользователям перетаскивать элементы по экрану в вашем приложении
Жест перетаскивания: движение перетаскивания, которое вызывает действие при изменении последовательности событий перетаскивания. - Документация Apple
В этом руководстве вы узнаете, что такое жест перетаскивания в SwiftUI. Вы научитесь:
- Используйте 1_
- Используйте
.updating
- Используйте
.onEnded
- Ограничить прокрутку
Предпосылки
Чтобы следовать этому руководству, вам понадобятся:
- Базовое знакомство со Swift
- Некоторые базовые знания по крайней мере в Xcode 11
.onChanged
onChanged
изменяет значение местоположения перетаскиваемого объекта. Затем это переместит объект.
Во-первых, давайте создадим переменную, которая может хранить размер. С помощью указанной ниже переменной объект теперь помещается в координату 50 как по x , так и по y.
@State private var rectPosition = CGPoint(x: 50, y: 50)
Когда прямоугольник перемещается, вы измените rectPosition
.
В результате у вас есть движущийся прямоугольник.
.updating
Вы можете узнать, перетаскивает пользователь или нет, прочитав состояние. Сначала создайте GestureState
, который будет содержать значение.
@GestureState private var isDragging = false
Здесь вы не можете обновить isDragging
, поскольку он доступен только для чтения. Но вы можете обновить состояние, которое затем обновит isDragging
.
.gesture(DragGesture().onChanged({ value in
self.rectPosition = value.location
}).updating($isDragging, body: { (value, state, trans) in
state = true
}))
.onEnded
Возможно, вам нужны определенные действия только после того, как пользователь завершит перетаскивание объекта. Сначала создайте переменную, чтобы знать, закончил ли пользователь перетаскивание или нет.
@State private var isEnded = false
Используя тот же код и, возможно, небольшую настройку, вы устанавливаете изменение цвета, если x меньше 120.
И вот результат:
Ограничить горизонтальную прокрутку
Слишком много перетаскивания по экрану; мое приложение не совсем поддерживает эту функцию. А как насчет горизонтального перетаскивания?
.gesture(DragGesture().onChanged({ value in
self.rectPosition = CGPoint(x: value.location.x, y: 50)
}))
Если вы хотите, чтобы он прокручивался только по вертикали, вы можете подумать об изменении только значения y.