damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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 }