42

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

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

4

4 回答 4

59

这是获取 a 的垂直模态表示的简单方法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 回答
13

要使用默认的模态转换样式,您可以简单地将转换委托设置为 self。

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

您需要UIViewControllerTransitioningDelegate在视图控制器中采用该协议,但不需要实现任何功能。

这在 WWDC的 Session 225 中提到, Safari View Controller 中的新增功能。

于 2017-10-15T02:15:40.767 回答
8

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];
}
于 2016-03-22T20:13:47.780 回答