我正在寻找我的 iOS 应用程序的主题,并且一直在阅读 UIAppearance。我希望用户能够在应用程序内切换多个不同的视觉主题。然后更改主题将显示在 UI 中。
我在想我可以有一个主题文件,它是在 appDelegate.m 中加载的单例。但在那之后我有点卡在如何实现这一点上?
我正在寻找我的 iOS 应用程序的主题,并且一直在阅读 UIAppearance。我希望用户能够在应用程序内切换多个不同的视觉主题。然后更改主题将显示在 UI 中。
我在想我可以有一个主题文件,它是在 appDelegate.m 中加载的单例。但在那之后我有点卡在如何实现这一点上?
将视图添加到视图层次结构后,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 并再次添加它。虽然我更喜欢第一个解决方案,因为它涵盖了更广泛的案例。
这在 Swift 中对我有用:
let windows = UIApplication.sharedApplication().windows
for window in windows {
for view in window.subviews {
view.removeFromSuperview()
window.addSubview(view)
}
}
罗伯特建议的解决方案对我不起作用。我正在使用 iOS9 和 UITabbarController 。这个建议是唯一有效的答案here
它基本上很好地解释了这个问题,当我们使用 UIAppearance 时,它基本上被应用并且不会改变,直到再次重绘视图,这不会发生尤其是像 UITabbarControllers 这样的 rootViewController 并且新颜色只有在应用程序从内存中删除后才会生效并再次打开,如果您想立即更改,则必须手动进行并设置每个属性,如附加链接中的答案中所述
迅捷4:
let windows = UIApplication.shared.windows
for window in windows {
for view in window.subviews {
view.removeFromSuperview()
window.addSubview(view)
}
}