当使用modalPresentationStyle = .FormSheet将SFSafariViewController推入UINavigationController时,显示不正确。

7
我有一个简单的设置表视图,它是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导航栏 - 这对我的使用情况非常完美。

有任何神奇的设置可以使其正常工作吗?


你最终找到了一个好的解决方案吗?我有一个非常类似的问题,很想知道你是如何处理的。 - Sijmen Mulder
1
@SijmenMulder 没有,我没有找到解决方案。最终我回归使用WKWebView,但不幸的是,它没有按照我的期望呈现网页。不知何故,SFSafariViewControlller的渲染效果更好。 - Daniel
抱歉。谢谢你让我知道! - Sijmen Mulder
3个回答

4

SFSafariViewController适用于iOS9.0或以上版本的苹果操作系统。 根据您的问题,您在使用SFSafariViewController视图时遇到了一些导航栏方面的问题,因为

enter image description here

SFSafariViewController嵌入自己的导航栏、UISearchbar和UIBarButton。当您从其他视图控制器推出SFSafariViewController时,您的应用导航栏将显示在SFSafariViewController导航栏之上。

enter image description here


3

虽然这不是一种完美的解决方法,但在这种情况下我所做的是将它放到导航控制器上,我正在执行以下操作:

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

我不得不关闭动画,否则它会试图从右侧带入视图控制器。CrossDissolve处理了出站动画。但这可能不是您想要的,因为在您的情况下,您想遮蔽URL并保留导航栏,而这种方法将覆盖导航栏并显示SFSafariViewController的导航栏。实际上,SFSafariViewController并不应该被这样使用,因此在您的情况下使用WKWebView的解决方法更加合理。
还有一点需要注意的是,当您在SFSafariViewController中点击“完成”按钮时,使用pushViewController实际上会关闭整个导航控制器,因此在大多数情况下,使用presentViewController会是更好的方式来显示,除非那是您想要的类型行为。

1
我已经意识到无法将SFSafariViewController推入现有的UINavigationController中。它带有自己的导航栏和工具栏。

虽然在iPhone上(至少在iOS 10+上)将其推入现有的导航控制器中,它可以正常工作,但在iPad上存在问题,因此如果您正在使用通用应用程序,请小心。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接