2016-02-25 8 views
20

UIViewControllerインスタンスでpresentViewController:animated:completion:を呼び出してSFSafariViewControllerを提示しています。iOS 9では、SFSafariViewControllerがモーダルではなくプッシュされているのはなぜですか?

結果は、私はUINavigationControllerインスタンスでpushViewController:animated:と呼ばれるかのように、(右からスライド)がオンをプッシュ取得することです。私はこれがすべてメインキューで起こっていることを確認しました。そして、提示しているビューコントローラはモーダルそのものではありません(これは問題ではありませんが、その場合には、それを排除できます)。

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

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

これを回避するにはどうすればよいでしょうか?

答えて

22

はここで垂直モーダル・プレゼンテーションを取得するための簡単な方法です:

let safari = SFSafariViewController(URL: url) 
safari.modalPresentationStyle = .OverFullScreen 
presentViewController(safari, animated: true, completion: nil) 
+0

戻ってナビゲートすると効果的ですが、これはモーダルではありません。 –

20

私はちょうど同じ問題を抱えていました。また、代理人を設定していない場合でも、完了ボタンは機能します。それがなぜ起こるかわからない。しかし、回避策が見つかりました。つまり、ナビゲーションコントローラに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) 
    } 
} 
5

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]; 
} 
2

デフォルトのモーダルのトランジションのスタイルを使用するには、次のことができ移行するデリゲートをselfに設定するだけです。

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

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

これはSession 225 at WWDC, What's New in Safari View Controllerに記載されています。