web-dev-qa-db-ja.com

iOS 9で、SFSafariViewControllerがモーダルで表示される代わりにプッシュされるのはなぜですか?

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

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

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

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

なぜ、どのようにこれを回避するのですか?

34
guptron

SFSafariViewControllerの垂直モーダルプレゼンテーションを取得する簡単な方法を次に示します。

let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .overFullScreen
presentViewController(safari, animated: true, completion: nil)
43
jamesk

私は同じ問題を抱えていました。また、デリゲートを設定しなくても、完了ボタンは機能します。それがなぜ起こるかわからない。しかし、回避策を見つけました:ナビゲーションコントローラーで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)
    }
}
24
iGerms

デフォルトのモーダルトランジションスタイルを使用するには、トランジションデリゲートをセルフに設定するだけです。

let svc = SFSafariViewController(url: url)
svc.transitioningDelegate = self //use default modal presentation instead of Push
present(svc, animated: true, completion: nil)

ビューコントローラーでUIViewControllerTransitioningDelegateプロトコルを採用する必要がありますが、実装に必要な関数はありません。

これは WWDCのセッション225、Safari View Controllerの新機能 で言及されました。

12
Jordan H

IGermsのObjective-Cバージョンの回答:

-(void)openURL:(NSURL *)url {
   SFSafariViewController *safariController = [[SFSafariViewController alloc]initWithURL:url];
   safariController.delegate = self;
   UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:safariController];
   [navigationController setNavigationBarHidden:YES animated:NO];
   [self presentViewController:navigationController animated:YES completion:nil];
}
7
Mark Bourke