在 SwiftUI 中滑动以接受动画

Posted

技术标签:

【中文标题】在 SwiftUI 中滑动以接受动画【英文标题】:Swipe to accept animation in SwiftUI 【发布时间】:2021-06-01 16:44:57 【问题描述】:

我想在 SwiftUI 中创建一个滑动来接受手势。

例如,在这张图片中,如果您向左滑动,会显示一个绿色矩形并显示“已接受”之类的信息。但是,您可以向右滑动,黑色矩形会回到原来的位置。

【问题讨论】:

到目前为止你尝试了什么? 我使用了 DragGesture,但它不能完全水平移动矩形 【参考方案1】:

您可以像这样滑动到操作按钮。您可以根据需要自定义和优化代码。

在 XCode 12.3 和 ios 14.3 中测试

typealias FrontView<V> = Group<V> where V:View
typealias BackView<V> = Group<V> where V:View

struct SwipeButton<Content: View, BackContent: View>: View 
    
    private var content: () -> TupleView<(FrontView<Content>, BackView<BackContent>)>
    @State private var offset = CGSize.zero
    
    private let onAction: () -> ()
    
    init(@ViewBuilder content: @escaping () -> TupleView<(FrontView<Content>, BackView<BackContent>)>, onAction: @escaping () -> Void) 
        self.content = content
        self.onAction = onAction
        self.content = content
    
    
    var body: some View 
        let (frontView, backView) = self.content().value
        
        return GeometryReader  (geometry) in
            ZStack 
                backView
                frontView
                    .offset(self.offset)
                    .gesture(DragGesture(minimumDistance: 30, coordinateSpace: .local)
                                .onChanged  gestrue in
                                    if gestrue.translation.width < 0  
                                        self.offset.width = gestrue.translation.width
                                    
                                    print(offset)
                                
                                .onEnded  value in
                                    if value.translation.width < 0 
                                        self.offset.width -= geometry.size.width
                                        onAction()
                                    
                                
                    )
            
        
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
        .animation(.spring())
    

用法

struct SwipeDemoView: View 
    var body: some View 
        SwipeButton 
            // Add your fron view
            FrontView 
                Text("Swipe").frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity).background(Color.black).foregroundColor(Color.white)
            
            // Add your back view
            BackView 
                Text("Accepted")
                    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
                    .background(Color.green)
            
         onAction: 
            print("Swiped...")
        
        .frame(width: 200, height: 50)
        .cornerRadius(15)
    

【讨论】:

以上是关于在 SwiftUI 中滑动以接受动画的主要内容,如果未能解决你的问题,请参考以下文章

滑动选项 swiftUI 滚动视图

swiftui,动画应用于父效果子动画

SwiftUI:在用户滑动以关闭时显示警报

NavigationView中的SwiftUI自定义动画过渡?

Swiftui 移除滑动删除功能

如何在 SwiftUI 中定义结构属性以接受线性或角度渐变?