在iOS 9中,为什么要推送SFSafariViewController而不是以模态方式呈现?

gup*_*ron 31 iphone uiviewcontroller ios ios9 sfsafariviewcontroller

SFSafariViewController通过调用presentViewController:animated:completion:一个UIViewController实例来呈现一个.

结果是它被推入(从右侧滑入),就好像我调用pushViewController:animated:了一个UINavigationController实例.我已经验证了这一切都发生在主队列上.并且呈现视图控制器本身不是模态(无论如何都应该无关紧要,但是以防万一,我们可以将其排除在外).

如果我SFSafariViewController用a 替换UIViewController它,它按预期工作,它以模态方式呈现.

weakSelf.oAuthViewController = [[SFSafariViewController alloc] initWithURL:url];
[viewController presentViewController:weakSelf.oAuthViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

知道为什么或如何解决这个问题?

jam*_*esk 42

这是获取垂直模态演示的简单方法:

let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .overFullScreen
presentViewController(safari, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

  • 我发现`.overCurrentContext`效果更好,因为当状态栏被隐藏(透明状态栏区域)时,它还可以防止iPhone X上的错误。 (2认同)

小智 24

我刚才有同样的问题.此外,即使您没有设置委托,完成按钮也能正常工作.不知道为什么会这样.但是,我找到了一个解决方法:将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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Jor*_*n H 11

要使用默认的模态转换样式,只需将转换委托设置为等于self即可.

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

您需要UIViewControllerTransitioningDelegate在视图控制器中采用该协议,但不需要实现所需的功能.

WWDC会议225中提到了这一点,Safari View Controller的新功能.


Mar*_*rke 7

Objective-C版iGerms回答:

-(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];
}
Run Code Online (Sandbox Code Playgroud)