我有一个简单的设置表视图,它是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导航栏 - 这对我的用例来说非常完美。
任何神奇的设置才能使其正常工作?
答案 0 :(得分:3)
SFSafariViewController适用于iOS9.0或更高版本的apple os。 根据你的问题你面临的一些问题在你的导航栏中显示了一些与SFSafariViewController视图的差距。因为
SFSafariViewController嵌入了自己的导航栏,UISearchbar,UIBarButton。当您从ViewController上推送SFSafariViewController,然后您的应用程序导航栏显示在SFSafariViewController导航栏上。
答案 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中打开按钮,此将给您的用户带来不便。