1

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

基本上,我希望能够轻松区分已登录和未登录我的应用程序。我的想法是,当用户未登录时,应用程序将在 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]

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

4

4 回答 4

4

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

于 2013-04-14T22:57:33.270 回答
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/

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

于 2014-07-17T07:42:43.313 回答
1

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

我的诀窍是:

  1. 创建 UITabBar 子类
  2. 将其链接到 XIB/StoryBoard 上的 UITabBarController
  3. 在创建项目时添加观察者(覆盖 - (void)setItems:(NSArray *)items animated:(BOOL)animate)
  4. 处理观察者
于 2013-01-16T10:54:14.240 回答
0

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

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

我的解决方案如下。

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

谢谢。

于 2019-09-10T01:07:19.707 回答