更改UIAppearence后刷新标签栏

时间:2013-01-16 01:24:36

标签: ios ios5 uiappearance

我有一个想法,我想尝试实施:

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

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

在搜索此问题的解决方案时,我发现了一些需要调用layoutSubviewsdrawRect的建议,以便视图刷新并采用UIAppearence的更改。但是,在我的app delegate中,我已经尝试了以下所有方法但没有成功:

[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发送电话,但如果是这样的话,我还没有办法做到这一点。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

我的诀窍是:

  1. 创建UITabBar子类
  2. 将其链接到XIB / StoryBoard上的UITabBarController
  3. 在项目创建时添加观察者(覆盖 - (void)setItems :( NSArray *)项目动画:(BOOL)动画)
  4. 处理观察员

答案 2 :(得分:1)

这是我用来在更改内部主题后刷新应用程序的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/

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

答案 3 :(得分:0)

问了这个问题已经很久了。 尝试应用暗模式(iOS13)时,我也遇到了同样的问题。

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

我的解决方案正在关注。

  1. 在UIViewController的子类上实现'traitCollectionDidChange'API。
  2. UITabbar的迭代项
  3. 具有UITabbarItem的'setTitleTextAttributes'的setTitleAttributes

谢谢。