我有一个想法,我想尝试实施:
基本上,我希望能够轻松区分登录和未登录我的应用程序。我的想法是,当用户未登录时,应用程序将在UIAppearence代理中设置背景颜色等。登录后,将通过更改UIAppearence设置来更改这些值。
我发现在更改UIAppearence之后,这种工作方式会有所改变,但并非所有UI元素都会刷新。最突出的例子是我的UITabBarController中的标签栏(我的窗口的rootViewController)。
在搜索此问题的解决方案时,我发现了一些需要调用layoutSubviews
或drawRect
的建议,以便视图刷新并采用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
发送电话,但如果是这样的话,我还没有办法做到这一点。
答案 0 :(得分:4)
在视图添加到视图层次结构后设置UIAppearance属性。 再次触发它的最简单方法是分离关键窗口的rootViewController,然后再次附加它。您还可以删除关键窗口的子视图并重新添加它们。
答案 1 :(得分:1)
我使用KVO通知我的自定义UITabBar。
我的诀窍是:
答案 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”进行了修改,并且更改了模式,但未进行任何更改。我必须强制更改文本颜色和字体。
我的解决方案正在关注。
谢谢。