SafariViewControllerDidFinish在向下滑动以关闭时不触发

4
我有一个在SFSafariViewController上的代理,在safariViewControllerDidFinish事件中执行清理任务。在iOS 13+中,用户可以向下滑动来关闭视图控制器,但在这种情况下,不会触发此事件。 我不想通过启用isModalInPresentation来禁用此手势。
有没有办法使safariViewControllerDidFinish在这种情况下被触发,或者如何检测用户向下滑动以关闭Safari视图控制器?
2个回答

2

@Frankenstein的答案对我有用,但是我花了一些时间来正确设置我的代码,所以在这里添加一些代码片段

class MyViewController: UIViewController {

  func presentSafariVC() {
    let url = //...
    let config = SFSafariViewController.Configuration()
    let safariVC = SFSafariViewController(url: url, configuration: config)
    safariVC.modalPresentationStyle = .formSheet
    safariVC.delegate = self
    safariVC.presentationController?.delegate = self
    present(safariVC, animated: true)
  }

}

extension MyViewController: SFSafariViewControllerDelegate, UIAdaptivePresentationControllerDelegate {

  // click top left "Done" button and dismissed
  func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
        // do your stuff
  }
    
  // swipe down and dismissed
  func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
        // do your stuff
  }

}

此外,我最初是想找到一种方法来防止向下滑动以解除显示的视图控制器,但似乎设置safariVC.isModalInPresentation = true没有效果,我仍然可以向下滑动以解除它。这在XCode 12,iOS 14.2模拟器上观察到。


和你一样的问题。这应该是被接受的答案。谢谢! - Davide

2
您可以通过将自己设置为展示控制器的代理并重写 presentationControllerDidDismiss(_:) 方法来了解用户通过向下滑动关闭 SFSafariViewController 的时间。查看有关此主题的文档

注意:如果您在程序中使用 dismiss(animated:),则不会调用此方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接