UINavigationBar 外观刷新?

Posted

技术标签:

【中文标题】UINavigationBar 外观刷新?【英文标题】:UINavigationBar appearance refresh? 【发布时间】:2014-03-06 08:28:09 【问题描述】:

在我的 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];

这也没有用。

如何在挑选新颜色时将我的设置视图“重绘”自身恢复,因此更改即时显而易见?

非常感谢!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我什至更进一步。我有一个自定义选项卡栏,我还需要更改它的颜色,它在父链更远的地方被实例化。因此,为了引用它,我实际上创建了一个委托协议,并以这种方式将消息发送到***导航控制器。在那里我使用 [[UINavigationBar 外观] setBarTintColor:colorSchemeColor]; [[UIToolbar 外观] setBarTintColor:colorSchemeColor]; [[UITabBar 外观] setBarTintColor:colorSchemeColor];他们在整个应用程序中一直重置颜色。【参考方案2】:

目标-C:

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

斯威夫特:

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

【讨论】:

值得注意的是,这非常有效。我有条件地加载 2 个视图控制器中的任何一个。第二个视图控制器在顶部有一个编辑按钮。我只是无法让那个编辑按钮出现,直到我尝试了这种方法。语法发生了一些变化:navigationController?.navigationBarHidden = true navigationController?.navigationBarHidden = false FWIW,我发现如果用户在刷新时滑回上一个视图控制器(即,从屏幕的前沿滑动并在视图控制器之间保持中途),这会破坏导航栏你触发刷新)。 @zaolian 非常感谢。经过近六个小时的网络尝试和搜索,这是唯一有效(也是最简单)的解决方案。 太棒了,这可能看起来违反直觉,但由于 .appearance() 仅影响新初始化的视图,因此效果非常好!【参考方案3】:

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

基于呈现和关闭模态视图控制器会强制其下方的所有内容重绘的想法,我尝试了这个并且效果很好:

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

【讨论】:

以上是关于UINavigationBar 外观刷新?的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar 在 Modal 上的外观未设置

带有 RECurtainViewController 的 UINavigationBar 外观

自定义 UINavigationBar 外观以在 CNContactPickerViewController 中显示

在iOS 11中忽略设置UINavigationBar外观

UINavigationBar 外观 setBackgroundImage 隐藏状态栏

UINavigationbar 通过外观设置阴影不起作用