SwiftUI:在打开“sheet”的情况下重新打开应用程序时,点击时出现奇怪的偏移

Jon*_*han 10 user-interface ios swiftui

我面临着一种奇怪的行为,看起来确实像 SwiftUI bug。

当我打开应用程序并.sheet重新打开它时,来自父级的所有内容都会有一个点击偏移量。这很难解释(英语不是我的母语)所以这是一个非常简单的例子:

struct ContentView: View {
    @State private var isOpen = false
    var body: some View {
        Button(action: {
            isOpen.toggle()
        }, label: {
            Text("Open sheet")
                .foregroundColor(.white)
                .padding()
                .background(.blue)
        })
        .sheet(isPresented: $isOpen, content: {
            Text("Sheet content")
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

要重现该问题,请按照下列步骤操作:

  1. 点击蓝色按钮顶部边框的正下方Open sheet:工作表按预期打开。
  2. 当工作表打开时,关闭应用程序(返回 Springboard,在 iOS 模拟器上使用 cmd+shift+H)。
  3. 重新打开应用程序。您仍在工作表视图中。
  4. 关闭工作表。您将返回到带有蓝色按钮的主视图。这是错误:
  5. 再次点击顶部边框正下方的蓝色按钮顶部。什么都没发生。您必须单击下面的几个像素。有一个偏移量使得主视图上的所有可点击项目未对齐。

有人也见过这个错误吗?我做错了什么吗?

其他注意事项:

  • 从主视图关闭应用程序时,该错误不会出现。即使错误出现并且我从主视图关闭应用程序并重新打开,错误也会消失。
  • 如果我使用 a.fullScreenCover代替.sheet,则不会出现该错误。
  • 它确实看起来像一个.sheets打开的错误。

编辑:
我尝试了两种解决方法,但都不起作用:

  • 将 嵌入Button到外部视图中。
  • Button仅替换为Text并添加.onTapGesture{ ... }修饰符以切换isOpen@State 属性。

编辑2:
经过几个小时的尝试,我可以找到一些有趣的东西:如果在工作表内容中,我添加一个按钮来关闭工作表,则错误不会再出现。但是,如果我用手指关闭该工作表(从上到下拖动),它仍然会出现。

这是修改后的代码:

struct ContentView: View {
    @State private var isOpen = false
    var body: some View {
        Button(action: {
            isOpen.toggle()
        }, label: {
            Text("Open sheet")
                .foregroundColor(.white)
                .padding()
                .background(.blue)
        })
        .sheet(isPresented: $isOpen, content: {
            SheetContent()
        })
    }
}

struct SheetContent: View {
    @Environment(\.dismiss) var dismiss
    var body: some View {
        Button(action: { dismiss() }, label: {
            Text("Dismiss sheet")
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来好像有什么东西可以调用(或不调用)@Environment(\.dismiss) var dismiss.

目前的状态在几天前要好一些,因为只有当用户通过向下拖动关闭工作表时才会出现该错误。但还是有问题。

有没有一种方法可以dismiss()在通过向下拖动关闭工作表时以编程方式调用?

小智 0

我面临着完全相同的问题。我已向 Apple 提交了错误报告。作为解决方法,我手动添加关闭按钮并使用.interactiveDismissDisabled()阻止用户向下滑动以关闭。这并不理想,但重要的是我的主页上的按钮按应有的方式工作......