在UINavigationController中使用modalPresentationStyle = .FormSheet推送时,SFSafariViewController显示不正确

我有一个简单的设置表视图,这是UINavigationController的第一个视图。

我使用.FormSheet modalPresentationStyle提供设置UINavigationController,这意味着在iPhone上占用全屏幕,而在iPad上则以模态方式显示居中。

现在我想要设置表中的一行将SFSafariViewController推到导航堆栈上。

这在iPhone上工作正常,但在iPad上没有。 iPad截图:

在这里输入图像说明

请注意,SFSafariViewController导航栏的一部分显示在导航栏下方(使用“设置”后退button)。 请参阅图像中的红色矩形。

let urlText = "http://www.apple.com" let url = NSURL(string: urlText)! let safariViewController = SFSafariViewController(URL: url) self.navigationController?.pushViewController(safariViewController, animated: true) 

在iPhone上,根本没有看到SFSafariViewController导航栏 – 这对我的用例来说是完美的。

任何魔术设置,使其正确工作?

SFSafariViewController可用于iOS9.0或更高版本的Apple OS。 根据你的问题,你面临一些问题,显示你的导航栏与SFSafariViewController view.because一些差距

在这里输入图像说明 SFSafariViewController是embedded自己的导航栏,UISearchbar,UIBarButton.When你推SFSafariViewController从ViewController然后你的应用程序导航栏显示在SFSafariViewController导航栏。 在这里输入图像说明

在这里输入图像说明

这不完全是一个解决办法,但这是我在这种情况下做了什么。 而不是在导航控制器上推它,我正在做下面的事情

 let sfController = SFSafariViewController(URL: NSURL(string:"url")!) sfController.modalPresentationStyle = .FormSheet sfController.modalTransitionStyle = .CrossDissolve presentViewController(sfController, animated: false, completion: nil) 

我不得不closuresanimation,因为它试图从右侧引入视图控制器。 CrossDissolve负责出站animation。 这可能不是你想要的,但在你的情况下,你想晦涩的url,并保持你的导航栏,因为这种方式涵盖了你的导航栏,并显示SFSafariViewController导航栏。 真的SFSafariViewController不应该这样使用,所以你的工作使用WKWebView更有意义在你的情况。

另外一个注意,使用pushViewController实际上会closures整个导航控制器,当你点击SFSafariViewController中的完成button,所以在大多数情况下,presentViewController将是更好的显示方式,除非这是你想要的行为types。

我已经认识到,不可能 SFSafariViewController 到预先存在的UINavigationController 。 它带有自己的导航栏和工具栏。

虽然iPhone在推送到现有的导航控制器时(至less在iOS 10+上) 确实可以工作,但它在iPad上有问题,所以要小心如果在通用应用程序上这样做。

具体来说,在iPad上, SFSafariViewController 没有工具栏,而是在Safari浏览器中打开的button直接显示在导航栏本身的右上angular。 由于SFSafariViewController不拥有或使用您推入的导航控制器,因此不会显示Safari浏览器中的打开button,这会给您的用户带来不便。