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

时间:2016-01-11 08:51:57

标签: ios swift uinavigationcontroller

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

我使用.FormSheet modalPresentationStyle呈现设置UINavigationController,这意味着在iPhone上它占据全屏,而在iPad上,它以模态方式显示。

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

这在iPhone上运行良好,但在iPad上没有。 iPad截图:

enter image description here

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

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

在iPhone上,你根本看不到SFSafariViewController导航栏 - 这对我的用例来说非常完美。

任何神奇的设置才能使其正常工作?

3 个答案:

答案 0 :(得分:3)

SFSafariViewController适用于iOS9.0或更高版本的apple os。 根据你的问题你面临的一些问题在你的导航栏中显示了一些与SFSafariViewController视图的差距。因为

enter image description here

SFSafariViewController嵌入了自己的导航栏,UISearchbar,UIBarButton。当您从ViewController上推送SFSafariViewController,然后您的应用程序导航栏显示在SFSafariViewController导航栏上。

enter image description here

答案 1 :(得分:2)

这不完全是一个修复,但这是我在这种情况下最终做的事情。而不是在导航控制器上推它我正在做以下

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

我不得不关闭动画,因为它试图从右边引入视图控制器。 CrossDissolve负责出站动画。这可能不是你想要的,但在你的情况下,你想要隐藏网址并保持你的导航栏在这里覆盖你的导航栏并显示SFSafariViewController导航栏。实际上SFSafariViewController不应该以这种方式使用,所以你在使用WKWebView时更有意义。

另外注意,当你点击SFSafariViewController中的完成按钮时,使用pushViewController实际上会关闭整个导航控制器,因此在大多数情况下,presentViewController将是更好的显示方式,除非这是你想要的行为类型。

答案 2 :(得分:0)

我已经意识到,SFSafariViewController 推送到预先存在的UINavigationController上是不可能的。它配有自己的导航栏和工具栏。

虽然在推入现有导航控制器时, 在iPhone上(至少在iOS 10+上)工作有点好,但它在iPad上有问题,所以如果你这样做就要小心在通用应用程序上。

具体来说,在iPad上,SFSafariViewController中有 no 工具栏,而在safari按钮中打开则直接显示在右上角的导航栏中。由于SFSafariViewController不拥有或使用您正在推送的导航控制器,因此会显示没有在Safari中打开按钮,此给您的用户带来不便。