SwiftUI视图转场后键盘与VoiceOver焦点位置异常问题求助
SwiftUI视图转场后键盘与VoiceOver焦点位置异常问题求助
各位好,我最近在做SwiftUI自定义底部弹窗的时候遇到了个无障碍焦点的坑,想请教下有没有优雅的解决办法。
情况是这样的:我们APP里做了个带NavigationStack的自定义底部弹窗,转场动画是从底部滑上来的那种,和系统弹窗的效果类似。但现在遇到了VoiceOver焦点的问题——iOS的无障碍系统好像只会识别元素的初始位置,当弹窗从底部向上转场完成后,焦点的位置还是不对,尤其是嵌套了NavigationStack的时候,这个问题特别明显。
我目前的核心代码大概是这样的:
@AccessibilityFocusState private var focusOnContent: Bool ZStack(alignment: .top) { NavigationStack { // 弹窗内的内容视图 } } .zIndex(10) .roundedCorner(12, corners: [.topLeft, .topRight]) .transition(UIAccessibility.isVoiceOverRunning ? .identity : .move(edge: .bottom)) .animation(.easeInOut(duration: 0.3), value: viewModel.showMenuSheet) .onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { self.focusOnContent = true } }
我已经试过几个临时方案,但都不太理想:
- 延迟发送UIAccessibility的通知,但效果不稳定
- 去掉NavigationStack或者转场动画的话,焦点就正常了,但这不符合我们的产品需求
- 延迟渲染NavigationStack,虽然能解决焦点问题,但动画变得特别奇怪,像是拉开窗帘一样,元素不会跟着一起向上动画,体验很差
想请教下各位,有没有办法既能保留完整的转场动画效果,又能让VoiceOver正确识别转场后元素的新位置?为什么嵌套NavigationStack和转场动画一起用就会触发这个问题呢?
内容来源于stack exchange
相关产品推荐
相关产品推荐

