UINavigationBar外观刷新?

Ken*_*ent 21 appearance uinavigationbar uitoolbar uitabbar

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

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

// set the colors and refresh the view
[[UINavigationBar appearance] setBarTintColor:colorSchemeColor];
[[UIToolbar appearance] setBarTintColor:colorSchemeColor];
[[UITabBar appearance] setBarTintColor:colorSchemeColor];
Run Code Online (Sandbox Code Playgroud)

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

那么我尝试在刷新设置视图后立即放置此代码:

[self.view setNeedsDisplay];
[self.view setNeedsLayout];
Run Code Online (Sandbox Code Playgroud)

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

[self.navigationController.view setNeedsDisplay];
[self.navigationController.view setNeedsLayout];
Run Code Online (Sandbox Code Playgroud)

这也不起作用.

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

非常感谢!

Aar*_*ger 33

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

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

self.navigationController.navigationBar.barTintColor = [UINavigationBar appearance].barTintColor;
Run Code Online (Sandbox Code Playgroud)


zao*_*ian 17

Objective-C的:

self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;
Run Code Online (Sandbox Code Playgroud)

迅速:

self.navigationController?.isNavigationBarHidden = true
self.navigationController?.isNavigationBarHidden = false
Run Code Online (Sandbox Code Playgroud)

  • FWIW,我发现如果用户在刷新时刷回到前一个视图控制器(例如,从屏幕的前沿滑动并在触发刷新时保持在视图控制器之间),这会打破导航栏. (4认同)
  • 值得注意的是,这非常有效。我有条件地加载 2 个视图控制器中的任何一个。第二个视图控制器在顶部有一个编辑按钮。在尝试此方法之前,我无法显示该编辑按钮。语法略有变化:`navigationController?.navigationBarHidden = true navigationController?.navigationBarHidden = false` (2认同)
  • @zaolian 非常感谢。经过近六个小时的网络尝试和搜索,这是唯一有效(也是最简单的)的解决方案。 (2认同)

arl*_*dia 8

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

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

UIViewController *redrawTrigger = [[UIViewController alloc] init];
redrawTrigger.modalPresentationStyle = UIModalPresentationFullScreen;
[mySplitViewController presentModalViewController:redrawTrigger animated:FALSE];
[mySplitViewController dismissModalViewControllerAnimated:FALSE];
[redrawTrigger release];
Run Code Online (Sandbox Code Playgroud)