在 SwiftUI 中关闭工作表后,导航栏按钮不可点击。以下是重现该问题的步骤
- 出示一张单子,
- 将应用程序移至后台一小段时间(2 秒)
- 恢复应用程序并向下滑动关闭工作表
现在导航栏按钮框架未对齐。点击的工作框架与按钮的可见框架不同。这在 iOS 16 模拟器上很容易重现,但在实际的 iOS 设备上会间歇性地重现。以下是重现该问题的最少代码
struct ContentView: View {
@State private var showSheetView = false
var body: some View {
NavigationView {
VStack {
navigationBarView
Color.blue
}
.sheet(isPresented: $showSheetView) {
FilterView()
}
.navigationBarHidden(true)
}
.navigationViewStyle(.stack)
}
private var navigationBarView: some View {
HStack(spacing: 0) {
Spacer()
Button {
showSheetView = true
} label: {
Text("Filter")
.padding()
.background(Color.red)
}
}
}
}
struct FilterView: View {
var body: some View {
Color.green
}
}
我也为这个问题苦苦挣扎,这显然是苹果的一个错误。
我发现了一个丑陋的黑客来解决这个问题。但为了使它工作,我必须在每次进入背景时重新绘制我的主视图。对于我的项目来说,在他们修复实际错误之前都可以。我希望它也能帮助你
当您检测到应用程序正在移至后台时,您可以强制应用程序根据 UUID() 重绘
struct BackgroundModeSheetBugApp: App {
@State private var id = UUID()
var body: some Scene {
WindowGroup {
ContentView()
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
id = UUID()
}
.id(id)
}
}
}
我已经用您的代码对其进行了测试,它在模拟器和设备上都能正常工作
附:我也鼓起勇气用你的例子向Apple提交了一个bug
附言对于我的应用程序,我还必须包装我的主视图来破解 UIViewControllerRepresentable 以修复填充问题。
struct UIHackMainTabView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIHostingController<MainTabView> {
let mainTab = MainTabView()
return UIHostingController(rootView: mainTab)
}
func updateUIViewController(_ pageViewController: UIHostingController<MainTabView>, context: Context) {
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)