我注意到在 SwiftUI 在iOS 13.3.1及更早版本中存在一些奇怪的可能是错误的行为。为了演示这种情况,以下是一个非常简单的场景:
完整的示例代码:
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") }
}
}
}
如何重现问题:
- 在iOS 13.4.1上启动应用程序
- 点击“Show”按钮
- (预期中,底部弹出一个面板)
- 使用“Hide”按钮关闭面板
- (预期中,面板被关闭了)
- 再次点击“Show”按钮以显示面板
预期结果:面板再次显示。
实际结果:“Show”按钮的触摸目标向下偏移了几个像素,导致该操作无法触发。这可以在View层次结构调试器中观察到:
其他注意事项:
- 如果将面板拖到屏幕底部,这种情况不会发生
- 仅当为托管视图激活大型导航栏项目标题时,此问题才会发生,使用内联标题时没有问题
所以现在我在猜想:是我犯了错误,还是这是一个真正的SwiftUI bug?如果是,则是否有易于解决的解决方法?我在SO上搜索了类似的问题,但没有找到完全相同的问题。
编辑: 我同时向苹果提交了Radar反馈FB7560960。
编辑2: 仍然存在于13.4.1中。