5

我正在寻找我的 iOS 应用程序的主题,并且一直在阅读 UIAppearance。我希望用户能够在应用程序内切换多个不同的视觉主题。然后更改主题将显示在 UI 中。

我在想我可以有一个主题文件,它是在 appDelegate.m 中加载的单例。但在那之后我有点卡在如何实现这一点上?

4

4 回答 4

13

将视图添加到视图层次结构后,UIKit 从 UIAppearance 代理设置属性。

UISS我使用这样的方法:

- (void)reloadAppearance {
    NSArray * windows = [UIApplication sharedApplication].windows;

    for (UIWindow *window in windows) {
        for (UIView *view in window.subviews) {
            [view removeFromSuperview];
            [window addSubview:view];
        }
    }
}

另一个技巧是从主窗口中删除 rootViewController 并再次添加它。虽然我更喜欢第一个解决方案,因为它涵盖了更广泛的案例。

于 2013-06-13T05:54:46.227 回答
2

这在 Swift 中对我有用:

let windows = UIApplication.sharedApplication().windows
for window in windows {
    for view in window.subviews {
        view.removeFromSuperview()
        window.addSubview(view)
    }
}
于 2016-06-30T08:34:58.063 回答
1

罗伯特建议的解决方案对我不起作用。我正在使用 iOS9 和 UITabbarController 。这个建议是唯一有效的答案here

它基本上很好地解释了这个问题,当我们使用 UIAppearance 时,它​​基本上被应用并且不会改变,直到再次重绘视图,这不会发生尤其是像 UITabbarControllers 这样的 rootViewController 并且新颜色只有在应用程序从内存中删除后才会生效并再次打开,如果您想立即更改,则必须手动进行并设置每个属性,如附加链接中的答案中所述

于 2015-11-22T19:05:06.677 回答
1

迅捷4:

let windows = UIApplication.shared.windows
for window in windows {
    for view in window.subviews {
        view.removeFromSuperview()
        window.addSubview(view)
    }
}
于 2018-04-22T12:49:43.013 回答