42

SFSafariViewControllerインスタンスを呼び出しpresentViewController:animated:completion:て提示していUIViewControllerます。

その結果、インスタンスを呼び出したかのように、プッシュされます (右からスライドします) 。これがすべてメイン キューで発生していることを確認しました。また、表示するビュー コントローラー自体はモーダルではありません (いずれにせよ重要ではありませんが、念のため、それを除外できます)。pushViewController:animated:UINavigationController

を に置き換えるSFSafariViewControllerと、UIViewController期待どおりに機能し、モーダルに表示されます。

weakSelf.oAuthViewController = [[SFSafariViewController alloc] initWithURL:url];
[viewController presentViewController:weakSelf.oAuthViewController animated:YES completion:nil];

なぜ、またはこれを回避する方法はありますか?

4

4 に答える 4

59

の垂直モーダル表示を取得する簡単な方法を次に示しSFSafariViewControllerます。

let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .overFullScreen
presentViewController(safari, animated: true, completion: nil)
于 2016-08-19T12:55:28.910 に答える
26

私はちょうど同じ問題を抱えていました。また、デリゲートを設定しなくても、完了ボタンは機能します。なぜそれが起こるのか分かりません。ただし、回避策を見つけました。Safari コントローラーをナビゲーション コントローラーにラップし、ナビゲーション バーを非表示にします。

func openURL(url:NSURL) {

    if #available(iOS 9.0, *) {
        let safariController = SFSafariViewController(url: url)
        safariController.delegate = self
        let navigationController = UINavigationController(rootViewController: safariController)
        navigationController.setNavigationBarHidden(true, animated: false)
        self.present(navigationController, animated: true, completion: nil)
    } else {
        UIApplication.sharedApplication().openURL(url)
    }
}
于 2016-03-03T19:00:25.523 に答える