UINavigationBar外观刷新?

时间:2014-02-08 23:12:22

标签: uinavigationbar uitabbar uitoolbar appearance

在我的iPad应用程序中,我有一个应用程序设置视图。其中一个选项允许用户切换界面颜色方案。设置视图由segue加载到一个单独的视图控制器,而不是我的“主”应用程序窗口。

当他们选择一种新颜色时,我会切换colorSchemeColor变量并执行以下操作:

// set the colors and refresh the view
[[UINavigationBar appearance] setBarTintColor:colorSchemeColor];
[[UIToolbar appearance] setBarTintColor:colorSchemeColor];
[[UITabBar appearance] setBarTintColor:colorSchemeColor];

但是,在我退出设置视图之前,没有任何条形图会改变颜色! (当设置窗口消失时,“主”应用程序的颜色会正确更改!)

然后我尝试将此代码放在刷新设置视图之后:

[self.view setNeedsDisplay];
[self.view setNeedsLayout];

没有帮助。所以我也添加了这个:

[self.navigationController.view setNeedsDisplay];
[self.navigationController.view setNeedsLayout];

这也不起作用。

当选择新颜色时,如何将我的设置视图设置为“重绘”,以便更改立即明显?

非常感谢!

3 个答案:

答案 0 :(得分:31)

外观代理仅影响新初始化视图的外观。在外观代理上设置颜色对已经可见的导航栏没有影响。

您需要手动更新当前视图;例如:

self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor;

答案 1 :(得分:14)

目标-C:

self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;

夫特:

self.navigationController?.isNavigationBarHidden = true
self.navigationController?.isNavigationBarHidden = false

答案 2 :(得分:8)

虽然我认为Aaron Brager的答案是理想的appraoch,但我的应用程序需要大约15种不同的外观设置并使用分割视图控制器,所以我必须将所有设置重新应用到全局外观,然后将它们全部应用到我显示的两个观点。这是很多冗余的代码。

根据提出和解除模态视图控制器的想法强制重绘它下面的所有内容,我尝试了这个并且它完美地运行了:

UIViewController *redrawTrigger = [[UIViewController alloc] init];
redrawTrigger.modalPresentationStyle = UIModalPresentationFullScreen;
[mySplitViewController presentModalViewController:redrawTrigger animated:FALSE];
[mySplitViewController dismissModalViewControllerAnimated:FALSE];
[redrawTrigger release];