Позвольте пользователям перетаскивать элементы по экрану в вашем приложении

Жест перетаскивания: движение перетаскивания, которое вызывает действие при изменении последовательности событий перетаскивания. - Документация 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.