SwipeToDismiss.swift (1316B)
1 // 2 // SwipeToDismiss.swift 3 // damus 4 // 5 // Created by Joel Klabo on 1/18/23. 6 // 7 8 import SwiftUI 9 10 struct SwipeToDismissModifier: ViewModifier { 11 let minDistance: CGFloat? 12 var onDismiss: () -> Void 13 @State private var offset: CGSize = .zero 14 @GestureState private var viewOffset: CGSize = .zero 15 16 func body(content: Content) -> some View { 17 content 18 .offset(y: viewOffset.height) 19 .animation(.interactiveSpring(), value: viewOffset) 20 .simultaneousGesture( 21 DragGesture(minimumDistance: minDistance ?? 10) 22 .updating($viewOffset, body: { value, gestureState, transaction in 23 gestureState = CGSize(width: value.location.x - value.startLocation.x, height: value.location.y - value.startLocation.y) 24 }) 25 .onChanged { gesture in 26 if gesture.translation.width < 50 { 27 offset = gesture.translation 28 } 29 } 30 .onEnded { _ in 31 if abs(offset.height) > 100 { 32 onDismiss() 33 } else { 34 offset = .zero 35 } 36 } 37 ) 38 } 39 }