ios 带有向后滑动手势的工作表解除手势导致应用程序冻结

zzzyeukh  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(112)

我在SwiftUI中发现了一个奇怪而令人沮丧的行为。如果你在导航链接中从视图中呈现一个工作表,然后(快速有序地):
1.向下滑动以关闭工作表
1.向后滑动(从左边缘向右)以关闭导航视图
应用程序将在返回到根视图之前冻结。背景化应用程序并将其前景化将使其不粘滞。
你必须非常快地执行这些步骤。有变通方法吗?我希望两种手势都能工作,而不会相互干扰。
此代码将重现问题:

struct ContentView: View {
    
    @State var showSheet = false
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink("blah") {
                    VStack {
                        Button("Show Sheet") {
                            showSheet.toggle()
                        }
                        .sheet(isPresented: $showSheet, onDismiss: nil) {
                            Text("Sheet")
                        }
                    }
                }
            }
        }
    }
}

字符串
这是模拟器中的问题的GIF。首先显示问题,然后显示如果您在后台运行应用程序,它会自行解决。


的数据

编辑:2022年10月:此错误仍然存在于iOS 16中
编辑:2023年9月:此错误仍然存在于iOS 17中

w8f9ii69

w8f9ii691#

我在这篇文章Common Pitfalls Caused by Delayed State Updates in SwiftUI中解释了这个问题的原因和解决方案

struct ContentView: View {
@State var showSheet = false
var body: some View {
    NavigationStack {
        VStack {
            NavigationLink("GO") {
                VStack {
                    Button("Show Sheet") {
                        showSheet.toggle()
                    }
                    .sheet(isPresented: $showSheet) {
                        Text("Sheet")
                    }
                }
            }
        }
    }
    .frame(maxWidth: .infinity, maxHeight: .infinity)
    .overlay(
        Group {
            if showSheet {
                Color.white.opacity(0.01)
                    .highPriorityGesture(DragGesture(minimumDistance: 0))
            }
        }
    )
  }
}

字符串

相关问题