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

如何实现点击Done按钮无动画关闭SFSafariViewController

解决SFSafariViewController点击Done按钮无动画关闭的问题

当用户点击SFSafariViewController的Done按钮时,系统会默认执行带动画的dismiss操作,这时候你在safariViewControllerDidFinish代理方法里调用dismiss(animated: false)不会生效——因为系统的动画流程已经启动,你的调用无法覆盖默认行为。

下面提供两种可行的解决方式:

方式一:自定义Done按钮(推荐)

直接替换系统的Done按钮,自己实现点击逻辑,就能完全控制关闭时的动画状态:

let vc = SFSafariViewController(url: webUrl)
vc.delegate = self

// 替换系统默认的Done按钮
let customDoneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(customDoneTapped))
vc.navigationItem.leftBarButtonItem = customDoneButton

self.present(vc, animated: true)

// 自定义按钮点击事件
@objc private func customDoneTapped() {
    presentedViewController?.dismiss(animated: false)
}

这种方式逻辑清晰,完全由自己控制按钮行为,不依赖系统内部默认流程,兼容性更好。

方式二:用CATransaction强制禁用动画(hack方式)

通过Core Animation的事务机制,在代理方法里强制关闭动画效果,能覆盖系统的默认动画:

extension MyCoolViewController: SFSafariViewControllerDelegate {
    func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
        CATransaction.begin()
        CATransaction.setDisableActions(true) // 禁用所有动画
        controller.dismiss(animated: false)
        CATransaction.commit()
    }
}

注意:这种方式属于hack手段,依赖系统内部的动画实现逻辑,未来iOS版本更新可能会失效,仅作为备选方案。

内容的提问来源于stack exchange,提问作者Mando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:02:08