重新加载标签栏外观

时间:2018-07-13 17:55:51

标签: ios swift tabbar

在用户将应用程序的外观从亮模式更改为暗模式后,我试图重新加载选项卡栏,反之亦然。我可以更新应用程序中除选项卡栏以外的所有内容。我不想强迫用户关闭应用程序。

4 个答案:

答案 0 :(得分:3)

如果您尝试查看有关UIAppearance的{​​{3}},则会看到注释:

  

iOS会在视图进入窗口时应用外观更改,但不会   更改窗口中已有视图的外观。 要更改   当前在窗口中的视图的外观,请删除该视图   从视图层次结构中放回去。

基于此注释,您可以通过删除外观并通过一些技巧来更改外观,并在对外观进行更改后立即设置层次结构中最顶层的视图:

guard let currentView = (UIApplication.shared.delegate as? AppDelegate)?.window?.rootViewController?.view,
    let superview = currentView.superview else { return }

UITabBar.appearance().tintColor = .green

currentView.removeFromSuperview()
superview.addSubview(currentView)

答案 1 :(得分:1)

在iOS 13中,您可以覆盖UITabBarController中的import { Directive, ElementRef, ViewContainerRef } from '@angular/core'; @Directive({ selector: '[OnChangeBlink]' }) export class OnChangeBlinkDirective{ readonly green_color:string = '#27AE60' readonly white_color:string = '#FFFFFF' element_ref:ElementRef; doBlink(color: string):void { if(color){ this.element_ref.nativeElement.style.backgroundColor = this.green_color; setTimeout(() => { this.element_ref.nativeElement.style.backgroundColor = this.white_color; }, 500); } } constructor(elRef: ElementRef, private vcRef: ViewContainerRef) { this.element_ref = elRef; const component = vcRef['_data']['componentView']['component']; if (component.hasOwnProperty('ngDoCheck')){//never happens console.log(component['ngDoCheck']); } } } 进行更改。参见documentation

示例:

traitCollectionDidChange(_:)

答案 2 :(得分:1)

我想说这里没有的答案是正确的(在撰写本文时)。为视图指定颜色时,您只需确保设置了暗模式颜色,系统会在用户更改模式时自动更新。

为此有两个主要选项:

  1. 使用资产目录并确保外观设置为“任何,深色”,设置两种颜色并将其分配给标签栏:

enter image description here

tabBar.backgroundColor = UIColor(named: "tabBarBackground")

  1. 或者您可以以编程方式设置暗模式颜色:

tabBar.backgroundColor = UIColor.clear.withDarkModeColor(.black)

答案 3 :(得分:0)

您可以使用tabBar.backgroundColor属性设置tabBar的颜色:

self?.tabBar.backgroundColor

请确保您要更新主线程上的背景色。

DispatchQueue.main.async { [weak self] in
   self?.tabBar.backgroundColor = newAppearanceColor
}