SFSafariViewController
インスタンスでpresentViewController:animated:completion:
を呼び出してUIViewController
を提示しています。
結果は、まるでUINavigationController
インスタンスでpushViewController:animated:
を呼び出したかのように、プッシュがオンになります(右からスライドインします)。これがすべてメインキューで発生していることを確認しました。また、表示するビューコントローラ自体はモーダルではありません(とにかく問題はありませんが、念のため、除外できます)。
SFSafariViewController
をUIViewController
に置き換えると、期待どおりに機能し、モーダルに表示されます。
weakSelf.oAuthViewController = [[SFSafariViewController alloc] initWithURL:url];
[viewController presentViewController:weakSelf.oAuthViewController animated:YES completion:nil];
なぜ、どのようにこれを回避するのですか?
SFSafariViewController
の垂直モーダルプレゼンテーションを取得する簡単な方法を次に示します。
let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .overFullScreen
presentViewController(safari, animated: true, completion: nil)
私は同じ問題を抱えていました。また、デリゲートを設定しなくても、完了ボタンは機能します。それがなぜ起こるかわからない。しかし、回避策を見つけました:ナビゲーションコントローラーで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)
}
}
デフォルトのモーダルトランジションスタイルを使用するには、トランジションデリゲートをセルフに設定するだけです。
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の新機能 で言及されました。
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];
}