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

时间:2020-02-02 12:49:07

标签: 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") }
        }
    }
}

要复制:

  1. 在iOS 13.4.1上启动应用程序
  2. 点击“显示”按钮
  3. (工作表按预期显示)
  4. 使用“隐藏”按钮关闭工作表
  5. (工作表已按预期解散)
  6. 尝试使用“显示”按钮再次显示工作表

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

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

Misaligned Views

其他观察结果:

  • 通过将其拖到屏幕底部来解散工作表时不会发生这种情况
  • 只有在为托管视图激活了较大的导航项标题时,才会发生这种情况,使用内联标题就可以了

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

编辑:同时,我将此文件作为“雷达反馈FB7560960”提交给了苹果公司。

编辑2:仍在13.4.1中发生。

1 个答案:

答案 0 :(得分:2)

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