statusBar設(shè)置為單例灭衷,因?yàn)橛行┛刂破鞔嬖趯?dǎo)航存在透明狀態(tài)
iOS 13之前,可以通過valueForKey 獲取UIApplication的statusBar旁涤,因?yàn)閁IApplication是單例翔曲,因此,在iOS 12劈愚,通過:?[[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]拿到的statusBar永遠(yuǎn)是同一個(gè)對(duì)象瞳遍。不行可以打印出內(nèi)存地址看下就很清楚了。iOS 13之后菌羽,因?yàn)樘O果不允許使用KVC的valueForKey訪問私有屬性掠械。通過上面的代碼可以多看點(diǎn),每次進(jìn)來都調(diào)用?alloc:init的方法注祖,重新生成一個(gè)statusBar猾蒂;然后添加到UIApplication的keyWindow上,再設(shè)置背景顏色是晨。因此這個(gè)方法多次調(diào)用就會(huì)創(chuàng)建多份statusBar肚菠,造成內(nèi)存開銷不說,如果設(shè)置為透明署鸡,根部不能起開效果案糙。
//狀態(tài)欄背景顏色設(shè)置
? ? func setStatusBarBackgroundColor(color : UIColor) {
? ? ? ? if #available(iOS 13.0, *) {
? ? ? ? ? ? if ???.statusBar == nil {//這個(gè)限嫌??时捌?代表當(dāng)前控制器怒医,
? ? ? ? ? ? ? ? ???.statusBar = UIView.init(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager!.statusBarFrame)!)
? ? ? ? ? ? ? ? ???.statusBar!.backgroundColor = color
? ? ? ? ? ? ? ? UIApplication.shared.keyWindow?.addSubview(???.statusBar!)
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ????.statusBar!.backgroundColor = color
? ? ? ? ? ? }
? ? ? ? }else{
? ? ? ? ? ? // Fallback on earlier versions
? ? ? ? ? ? let statusBarWindow : UIView = UIApplication.shared.value(forKey: "statusBarWindow") as! UIView
? ? ? ? ? ? letstatusBar :UIView= statusBarWindow.value(forKey:"statusBar")as!UIView
? ? ? ? ? ? if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
? ? ? ? ? ? ? ? statusBar.backgroundColor= color
? ? ? ? ? ? }
? ? ? ? }
? ? }