Safari 视图控制器使用错误的状态栏颜色
Posted
技术标签:
【中文标题】Safari 视图控制器使用错误的状态栏颜色【英文标题】:Safari View Controller uses wrong status bar color 【发布时间】:2016-05-10 23:06:35 【问题描述】:我的应用使用深色导航栏颜色。因此,我将状态栏颜色设置为白色(因此具有很好的对比度)。
我通过将 barStyle 设置为黑色(使状态栏变为白色)并将 barTint 设置为我的深红色来做到这一点。完美运行。
我像这样呈现SafariViewController
:
func openWebsite(urlString: String)
if let url = NSURL(string: urlString)
let svc = SFSafariViewController(URL: url)
svc.delegate = self
self.presentViewController(svc, animated: true, completion: nil)
但是呈现的SafariViewController
的状态栏仍然是白色的。这是一个问题,因为SVC
导航栏具有默认的白色透明ios 默认样式。所以状态栏基本不可见。
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:您可以通过使用子类 UINavigationController 包装 SFSafariViewController 来实现。
BlackStatusBarNavigationController.h
@interface BlackStatusBarNavigationController : UINavigationController
@end
BlackStatusBarNavigationController.h
@interface BlackStatusBarNavigationController ()
@end
@implementation BlackStatusBarNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle
return UIStatusBarStyleDefault;
@end
这样使用:
UINavigationController *navigationController = [[BlackStatusBarNavigationController alloc] initWithRootViewController:viewController];
navigationController.navigationBarHidden = YES;
[self presentViewController:navigationController animated:YES completion:nil];
【讨论】:
迄今为止我找到的最佳答案和简单的方法,同时仍然支持已批准的 preferredStatusBarStyle 方法!【参考方案2】:有两种方法可以覆盖 viewControllers 中的 preferredStatusBarStyle 并返回你想要的一种
- (UIStatusBarStyle)preferredStatusBarStyle
return UIStatusBarStyleLightContent;
override func preferredStatusBarStyle() -> UIStatusBarStyle
return .Default
或者你可以手动设置
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
如何通过 sharedApplicaion 设置它,您需要将它添加到您的 plist “查看基于控制器的状态栏外观”为 NO
【讨论】:
感谢您的回复。我知道这一切。 为我自己的视图控制器设置状态栏样式效果很好。但是我不知道如何使Safari View Controller
我们成为正确的状态栏样式。这是 Apple 课程,不受我的直接控制。
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];不适合你?在通话之前添加它?
在调用 SVC 之前设置 UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default
不会改变任何东西。这是因为我使用 View Controller based status bar color
设置为 YES
,因为我的应用程序需要它。我也不能为Safari View Controller
覆盖preferredStatusBarStyle
,因为它不是我的班级。【参考方案3】:
如果你想为iOS 13+设置状态栏的背景颜色,你可以尝试这样设置它。
import UIKit
import SafariServices
class CustomSFSafariViewController: SFSafariViewController
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(true)
if #available(iOS 13.0, *)
UIApplication.shared.statusBarView?.backgroundColor = .purple
setNeedsStatusBarAppearanceUpdate()
extension UIApplication
@available(iOS 13.0, *)
var statusBarView: UIView?
let tag = 3848245
let keyWindow = connectedScenes
.map($0 as? UIWindowScene)
.compactMap($0)
.first?.windows.first
if let statusBar = keyWindow?.viewWithTag(tag)
return statusBar
else
let height = keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? .zero
let statusBarView = UIView(frame: height)
statusBarView.tag = tag
statusBarView.layer.zPosition = 999999
keyWindow?.addSubview(statusBarView)
return statusBarView
您可以使用一些有用的属性来自定义 SFSafariViewController:
preferredControlTintColor(工具栏项的颜色) preferredBarTintColor(工具栏颜色)附:不要忘记使用CustomSFSafariViewController
而不是SFSafariViewController
。你可以这样做。
let safariViewController = CustomSFSafariViewController(url: url)
【讨论】:
以上是关于Safari 视图控制器使用错误的状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章