如何实现点击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
相关产品推荐
相关产品推荐

