Ios 在modalPresentationStyle=.FormSheet的UINavigationController中推入时,SFSafariViewController显示不正确

Ios 在modalPresentationStyle=.FormSheet的UINavigationController中推入时,SFSafariViewController显示不正确,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,我有一个简单的设置表视图,它是UINavigationController的第一个视图 我使用.FormSheet modalPresentationStyle显示UINavigationController的设置,这意味着在iPhone上它占据全屏,而在iPad上,它以居中模式显示 现在,我想要设置表中的一行将SFSafariViewController推送到导航堆栈上 这在iPhone上运行良好,但在iPad上则不行。iPad屏幕截图: 请注意,SFSafariViewController

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

我使用.FormSheet modalPresentationStyle显示UINavigationController的设置,这意味着在iPhone上它占据全屏,而在iPad上,它以居中模式显示

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

这在iPhone上运行良好,但在iPad上则不行。iPad屏幕截图:

请注意,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导航栏——它非常适合我的使用案例


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

SFSafariViewController可用于iOS9.0或更高版本的苹果操作系统。 根据您面临的问题,使用SFSafariViewController视图在导航栏中显示一些间隙。因为

SFSafariViewController嵌入了自己的导航栏、UISearchbar、UIBarButton。当您从ViewController上按SFSafariViewController时,应用程序导航栏将显示在SFSafariViewController导航栏上


这并不是一个确切的解决方案,但以下是我在这种情况下的最终做法。我现在做的不是把它推到导航控制器上,而是

let sfController = SFSafariViewController(URL: NSURL(string:"url")!)
sfController.modalPresentationStyle = .FormSheet
sfController.modalTransitionStyle = .CrossDissolve
presentViewController(sfController, animated: false, completion: nil)
我必须关闭动画,因为它试图从右侧引入视图控制器,否则。Cross解散负责出站动画。这可能不是您想要的,因为在您的情况下,您希望隐藏url并保持导航栏,因为这样可以覆盖导航栏并显示SFSafariViewController导航栏。实际上,SFSafariViewController不应该以这种方式使用,因此您使用WKWebView的方法在您的案例中更有意义


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

我意识到,不可能按下
SFSafariViewController
安装到预先存在的
UINavigationController
上。它有自己的导航栏和工具栏

虽然它在iPhone上(至少在iOS 10+上)可以正常工作,但在iPad上有问题,所以在通用应用程序上使用时要小心


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

您最终找到了一个好的解决方案吗?我有一个非常类似的问题,很想知道你是如何处理的。@SijmenMulder不,我没有找到解决办法。我最终恢复使用WKWebView,不幸的是它没有按预期呈现我的网页。不知何故,sfsafariviewcontroller渲染效果更好。谢谢你让我知道!