Site icon AppTractor

Реагирование на жесты в SwiftUI: перетаскивание

В SwiftUI, если вам необходимо сгенерировать жест перетаскивания, который вызывает действие, используйте структуру DragGesture.

@State var isBeingDragged = false

var draggingGesture: some Gesture {
        DragGesture()
                .onChanged { _ in self.isBeingDragged = true }
                .onEnded { _ in self.isBeingDragged = false }
}

Модификаторы onChanged(_:) и onEnded(_:) позволяют контролировать, что происходит, когда пользователь выполняет жест, и что происходит после его остановки.

При инициализации объекта жеста перетаскивания можно использовать инициализатор DragGesture(minimumDistance:coordinateSpace:), чтобы определить наименьшее расстояние перетаскивания для завершения жеста с помощью свойства minimumDistance, а также координатное пространство, в котором жест получает значения местоположения, с помощью свойства coordinateSpace.

struct DraggingPlaygroundView: View {
    
    let circleSize: CGFloat = 75
    
    @State var isDragging = false
    @State var currentPosition: CGPoint = .zero
    
    var draggingObject: some Gesture {
        DragGesture(minimumDistance: 1, coordinateSpace: .local)
            .onChanged { gesture in
                self.isDragging = true
                self.currentPosition = gesture.location
            }
            .onEnded { _ in self.isDragging = false }
    }
    
    
    var body: some View {
        Circle()
            .fill(Color.blue)
            .shadow(color: .primary, radius: isDragging ? 3 : 0, x: 0, y: isDragging ? 5 : 0)
            .frame(width: circleSize, height: circleSize, alignment: .center)
            .position(currentPosition)
            .gesture(draggingObject)
            .onAppear {
                setupView()
            }
    }
    
    private func setupView() {
        let initialX = UIScreen.main.bounds.width / 2
        let initialY = UIScreen.main.bounds.height / 2
        
        currentPosition = CGPoint(x: initialX, y: initialY)
    }
}

Источник

Exit mobile version