Connect with us

Разработка

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

Узнайте, как реализовать жесты перетаскивания в 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)
    }
}

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: