2021年9月20号就看有新闻苹果向用户推送了iOS15正式版本的新闻,做为了一个开发者,自然就想到即将要开始采坑。
没想到两天后就是中秋节后上班的上午,公司的同事就反馈企业版本app在iOS15上无法打开,提示如下:
“XXX”需要更新
此App的开发者需要更新App以在此iOS版本上正常工作。
没想到来得如此之快,在半年前无法提交app到appstore就为更新系统更新xcode,更新系统需要清理出20G以上的空间(因为我的电脑只有128G),为此是删删这删删那。
今天更新支持iOS15开发的xcode肯定是要大动干戈。
更新好系统,下载最新的xcode,但xcode一直卡在正在安装,大概花了1个多小时,这个要吐槽一下,还好最后安装成功了。
xcode 13打工程,心中祈祷不要有什么致命的BUG导致无法打包和无法调试。
不负祈祷,运行调试成功,打包也成功,就是导航条及状态栏背景是白色。
在iOS15前的低版本都是正常的相关设置如下:
info.plist 中 View controller-based status bar appearance 为 YES
在BaseNavigationController中代码如下:
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
baseViewController设置了导航条不透明,导航条设置为橙色,代码如下:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.isTranslucent = false
navigationController?.navigationBar.barTintColor = kOrangeColor
navigationController?.navigationBar.tintAdjustmentMode = .normal
let attributes = [NSAttributedString.Key.foregroundColor:UIColor.white]
navigationController?.navigationBar.titleTextAttributes = attributes
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
猜测和状态设置为白色有关,也可能是iOS15的BUG,导致navigationController?.navigationBar.barTintColor = kOrangeColor这一句代码没生效。
这时我们开始解决:
在BaseNavigationController中添加如下代码:
override func viewDidLoad() {
super.viewDidLoad()
navigationBar.backgroundColor = kOrangeColor
}
导航条的颜色正常显示了,但状态栏的背景还是白色,找一下api没有UIStatusBar相关设置颜色的类,网上的做法都是使用valueForKey的方式。
//设置状态栏颜色
- (void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}
虽然没有尝试,担心上架被拒,以前热更新正火的时候,确实找到了相关的连接https://www.jianshu.com/p/809127540ac6
于是我就在刚才设置导航条背景颜色的地方加了如下代码:
let rect = UIApplication.shared.statusBarFrame
let status = UIView(frame: CGRect(x: 0, y: -rect.height, width: rect.width, height: rect.height))
status.backgroundColor = kOrangeColor
navigationBar.addSubview(status)
虽然也是骚操作,但效果还是可以的。
防止影响iOS15下的效果,最终整理一下BaseNavigationController代码如下:
import UIKit
class BaseNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if #available(iOS 15, *) {
navigationBar.backgroundColor = kOrangeColor
let rect = UIApplication.shared.statusBarFrame
let status = UIView(frame: CGRect(x: 0, y: -rect.height, width: rect.width, height: rect.height))
status.backgroundColor = kOrangeColor
navigationBar.addSubview(status)
}
}
// BaseNavigationViewController 中的方法
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
}
效果如下:
2021年9月23号上午在google上找到官方回答,正确的设置如下:
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = <your tint color>
navigationBar.standardAppearance = appearance;
navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance