SwiftUI:解散工作表后导航栏按钮的点击目标未对齐

Jos*_*hua 5 ios swift swiftui

我注意到使用 iOS 13.3.1 及更早版本的 SwiftUI 中有一个相当奇怪的、可能有问题的行为。为了演示,这个非常简单的场景:

完整示例代码:

import SwiftUI

struct ContentView: View {
    @State var showingSheet: Bool = false
    var body: some View {
        NavigationView {
            Text("ParentView")
                .navigationBarItems(trailing: Button(action: { self.showingSheet = true }) { Text("Show") })
        }.sheet(isPresented: $showingSheet) { SheetView() }
    }
}

struct SheetView: View {
    @Environment(\.presentationMode) var presentationMode
    var body: some View {
        VStack {
            Text("Sheet content")
            Button(action: { self.presentationMode.wrappedValue.dismiss() }) { Text("Hide") }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重现:

  1. 在 iOS 13.4.1 上启动应用程序
  2. 点击“显示”按钮
  3. (该表显示,如预期)
  4. 使用“隐藏”按钮关闭工作表
  5. (正如预期的那样,该工作表已被驳回)
  6. 尝试再次显示工作表,使用“显示”按钮

预期结果:工作表再次显示。

实际结果:“显示”按钮的点击目标向底部移动了一些像素,导致动作未触发。这也可以在 View Hierarchy Debugger 中观察到:

未对齐的视图

其他观察:

  • 通过将工作表拖动到屏幕底部来解除工作表时不会发生这种情况
  • 仅当为托管视图激活大型导航项标题时才会发生这种情况,使用内联标题时很好

所以现在我想知道:我是不是犯了一个错误,或者这是一个实际的 SwiftUI 错误?如果是这样,是否有简单的解决方法?我搜索了类似的问题,但没有遇到任何相同的问题。

编辑:在此期间,我将其作为 Radar Feedback FB7560960 提交给 Apple。

编辑 2:仍在 13.4.1 中发生。

小智 2

我不知道为什么,但添加 @Environment(\.presentationMode) var presentationMode 似乎contentView可以解决它。