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

iPhone端SwiftUI中Popover下滑关闭动画异常问题咨询

SwiftUI Popover下滑关闭时动画异常问题(iOS 14.0.1/Xcode 12.0.1)

我之前也踩过这个坑!在iOS 14.0.1搭配Xcode 12.0.1的环境下,SwiftUI的Popover通过下滑手势关闭时,确实会出现动画异常的情况,比如卡顿、错位或者突然消失。

问题原因

这其实是iOS 14正式版初期的SwiftUI框架bug。苹果当时在Popover的手势交互和关闭动画的协同逻辑上有漏洞:当用户触发下滑关闭手势时,框架没能正确同步Popover的布局状态和动画参数,导致动画过渡出现异常。尤其是当你的Popover内容像示例里那样,用了edgesIgnoringSafeArea(.all)占满安全区域时,这个问题会更显著——因为框架计算动画过渡区域时,没有正确识别安全区域的偏移处理。

你的示例代码格式化

你提供的代码可以整理为:

struct MyPopover: View {
    var body: some View {
        VStack {
            Spacer()
            Button("Show alert") {
                // 按钮逻辑
            }
            Spacer()
        }
        .frame(maxWidth: .infinity)
        .background(Color.green.edgesIgnoringSafeArea(.all))
    }
}

struct ContentView: View {
    @State private var isShowingPopover = false
    
    var body: some View {
        Button("Tap me to show a popover!") {
            self.isShowingPopover.toggle()
        }
        .popover(isPresented: self.$isShowingPopover) {
            MyPopover()
        }
    }
}

临时解决与彻底修复方案

你提到用.sheet()作为临时替代是完全可行的,因为Sheet的手势关闭逻辑在iOS 14早期版本里的实现相对独立,没受到这个Popover bug的影响。

如果想彻底解决这个问题,建议升级到iOS 14.2及以上版本,同时搭配对应的Xcode更新版本——苹果在后续的系统更新里已经修复了这个Popover动画的bug,升级后就能正常使用下滑关闭的动画了。

内容的提问来源于stack exchange,提问作者Bart van Kuik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:42:52