You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:24:35