更改 UIAppearence 后刷新标签栏
Posted
技术标签:
【中文标题】更改 UIAppearence 后刷新标签栏【英文标题】:Refreshing A Tab Bar after changing UIAppearence 【发布时间】:2013-01-16 01:24:36 【问题描述】:我有一个想法想尝试实现:
基本上,我希望能够轻松区分已登录和未登录我的应用程序。我的想法是,当用户未登录时,应用程序将在 UIAppearence 代理中设置背景颜色等。登录后,这些值将通过更改 UIAppearence 设置来更改。
我发现这种方法可行,但并非所有 UI 元素都会在更改 UIAppearence 后刷新。最突出的例子是我的 UITabBarController 中的标签栏(它是我窗口的 rootViewController)。
在寻找此问题的解决方案时,我发现了一些建议,即需要调用 layoutSubviews
或 drawRect
以使视图刷新并采用对 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 后刷新标签栏的主要内容,如果未能解决你的问题,请参考以下文章