4

我有一个SFSafariViewController负责清理safariViewControllerDidFinish事件中任务的代表。在 iOS 13+ 中,用户可以向下滑动以关闭,但在这种情况下不会触发此事件。我不想通过启用来禁用此手势isModalInPresentation

有没有办法让safariViewControllerDidFinish这种情况着火,或者我如何检测用户向下滑动以关闭 Safari 视图控制器?

4

2 回答 2

2

SFSafariViewController您可以通过将自己设置为演示控制器的委托并覆盖来了解用户何时关闭presentationControllerDidDismiss(_:)。查看有关此主题的文档。

dismiss(animated:)注意:如果您以编程方式使用,则不会调用此方法。

于 2020-06-01T15:57:15.550 回答
1

@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
  }

}

另外,我本来是在寻找一种防止向下滑动关闭呈现的vc的方法,但似乎设置safariVC.isModalInPresentation = true没有效果,我仍然可以向下滑动关闭它。这是在 XCode 12、iOS 14.2 模拟器上观察到的。

于 2020-11-21T01:33:11.120 回答