iOS 15 解决导航设置无效的问题

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 = 
navigationBar.standardAppearance = appearance;
navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance

原文地址:https://developer.apple.com/forums/thread/682420

你可能感兴趣的:(iOS 15 解决导航设置无效的问题)