Library / Drag, swipe & scroll

Drag: pick up and drop

Dragging a card or icon: a soft lift when it detaches, a rigid thud when it lands.

0ms 105ms 210ms 315ms 420ms
Feel
Lift = soft and light (the object comes free). Drop = rigid and stronger (it settles into place).
APIs
UIImpactFeedbackGenerator(.soft / .rigid)DragGesture
Minimum OS
iOS 13+
Raw .md
SwiftUI
import SwiftUI

struct DraggableCard: View {
    @State private var offset: CGSize = .zero
    @State private var dragging = false

    private let lift = UIImpactFeedbackGenerator(style: .soft)
    private let drop = UIImpactFeedbackGenerator(style: .rigid)

    var body: some View {
        RoundedRectangle(cornerRadius: 16)
            .fill(.blue.gradient)
            .frame(width: 140, height: 90)
            .scaleEffect(dragging ? 1.06 : 1.0)
            .shadow(radius: dragging ? 12 : 2)
            .offset(offset)
            .gesture(
                DragGesture()
                    .onChanged { value in
                        if !dragging {
                            dragging = true
                            lift.impactOccurred(intensity: 0.6) // pick up
                            drop.prepare()
                        }
                        offset = value.translation
                    }
                    .onEnded { _ in
                        dragging = false
                        drop.impactOccurred() // land
                        withAnimation(.spring) { offset = .zero }
                    }
            )
            .animation(.spring(duration: 0.2), value: dragging)
    }
}
Copied