更改 UIAppearence 后刷新标签栏

Posted

技术标签:

【中文标题】更改 UIAppearence 后刷新标签栏【英文标题】:Refreshing A Tab Bar after changing UIAppearence 【发布时间】:2013-01-16 01:24:36 【问题描述】:

我有一个想法想尝试实现:

基本上,我希望能够轻松区分已登录和未登录我的应用程序。我的想法是,当用户未登录时,应用程序将在 UIAppearence 代理中设置背景颜色等。登录后,这些值将通过更改 UIAppearence 设置来更改。

我发现这种方法可行,但并非所有 UI 元素都会在更改 UIAppearence 后刷新。最突出的例子是我的 UITabBarController 中的标签栏(它是我窗口的 rootViewController)。

在寻找此问题的解决方案时,我发现了一些建议,即需要调用 layoutSubviewsdrawRect 以使视图刷新并采用对 UIAppearence 的更改。但是,在我的应用委托中,我尝试了以下所有方法但均未成功:

[self.window.rootViewController.view setNeedsLayout]
[self.window.rootViewController.view setNeedsDisplay]

[self.tabbarController.tabBar setNeedsLayout]
[self.tabbarController.tabBar setNeedsDisplay]

[self.tabbarController.view setNeedsLayout]
[self.tabbarController.view setNeedsDisplay]

任何人对我如何强制标签栏(和其他视图)重绘有任何技巧或见解吗?我在想我只想在 UIView 层次结构中一直向layoutSubviews 发送调用,但如果是这样,我还没有找到方法。

【问题讨论】:

【参考方案1】:

UIAppearance 属性在视图添加到视图层次结构后设置。 再次触发它的最简单技巧是分离关键窗口的 rootViewController,然后再次附加它。您还可以删除关键窗口的子视图并重新添加它们。

【讨论】:

【参考方案2】:

我已经使用 KVO 来通知我的自定义 UITabBar。

我的诀窍是:

    创建 UITabBar 子类 将其链接到 XIB/StoryBoard 上的 UITabBarController 在创建项目时添加观察者(覆盖 - (void)setItems:(NSArray *)items animated:(BOOL)animate) 处理观察者

【讨论】:

感谢您的回答。不过,我正在寻找特定于 UIAppearance 的东西。【参考方案3】:

这是一个 sn-p,用于在更改内部主题后刷新应用程序的 UIAppearance。

NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window in windows) 
    for (UIView *view in window.subviews) 
        [view removeFromSuperview];
        [window addSubview:view];
    

http://snipplr.com/view/75259/refresh-uiappearance-after-application-loaded/

希望它能满足您的需求,对我来说它是完美的。

【讨论】:

嗨,大卫,我试过了,但对我没用【参考方案4】:

你已经很久没有问这个问题了。 当我尝试应用暗模式(ios13)时,我遇到了同样的问题。

UITabbar 已使用“外观 API”进行了修改,并且当模式已更改时,但没有任何更改。我必须强制更改文本颜色和字体。

我的解决方案如下。

    在 UIViewController 的子类上实现 'traitCollectionDidChange' API。 迭代UITabbar的项目 setTitleAttributes 与 UITabbarItem 的“setTitleTextAttributes”

谢谢。

【讨论】:

我也遇到了同样的问题。我将项目的选定图像设置为暗模式。当我在“设置”中切换模式时。它没有改变。所以我认为这应该是 iOS 13.0 中的一个错误。

以上是关于更改 UIAppearence 后刷新标签栏的主要内容,如果未能解决你的问题,请参考以下文章

如何从“更多”标签栏项目中的编辑检测标签栏项目更改?

在 webview 上刷新标签栏项目

标签更改后导航栏下的表格视图

js 监听浏览器切换标签栏 之 更改标题

js 监听浏览器切换标签栏 之 更改标题

在 ViewController 中重新加载/刷新选项卡栏项目?