使用 UIAppearance 和切换主题
Posted
技术标签:
【中文标题】使用 UIAppearance 和切换主题【英文标题】:Using UIAppearance and switching themes 【发布时间】:2013-06-12 16:24:54 【问题描述】:我正在寻找我的 ios 应用程序的主题,并且一直在阅读 UIAppearance。我希望用户能够在应用程序内切换多个不同的视觉主题。更改的主题随后会显示在 UI 中。
我想我可以在 appDelegate.m 中加载一个单独的主题文件。但在那之后,我对如何实现这一点有点困惑?
【问题讨论】:
您可能对 UISS 感兴趣:github.com/robertwijas/UISS 在此之前未见过 UIS,看起来它也解决了更改主题时的重新加载问题。谢谢! 【参考方案1】:在视图添加到视图层次结构后,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 并重新添加它。虽然我更喜欢第一种解决方案,因为它涵盖的案例范围更广。
【讨论】:
我已经开始使用 UIS 并且喜欢它。你会如何交换主题?只是重新加载一个不同的主题文件? UISS 目前没有正式支持主题。但是,您可以通过更改 UISS.style.url 并在 UISS 实例上调用 reloadStyleAsynchronously 来使其工作。 出于某种原因,在 iOS9 中,这两个建议都对我不起作用【参考方案2】:这在 Swift 中适用于我:
let windows = UIApplication.sharedApplication().windows
for window in windows
for view in window.subviews
view.removeFromSuperview()
window.addSubview(view)
【讨论】:
【参考方案3】:罗伯特建议的解决方案对我不起作用。我正在使用 iOS9 和 UITabbarController 。 这个建议是唯一有效的答案here
它基本上很好地解释了问题,当我们使用 UIAppearance 时,它基本上被应用并且不会改变,直到再次重绘视图,这不会发生尤其是像 UITabbarControllers 这样的 rootViewController 并且新颜色只有在应用程序之后才会生效从内存中删除并再次打开,如果您想立即更改,则必须手动进行并设置每个属性,如附加链接中的答案中所述
【讨论】:
【参考方案4】:迅速 4:
let windows = UIApplication.shared.windows
for window in windows
for view in window.subviews
view.removeFromSuperview()
window.addSubview(view)
【讨论】:
以上是关于使用 UIAppearance 和切换主题的主要内容,如果未能解决你的问题,请参考以下文章
如何使 UIAppearance 代理适用于以编程方式创建的视图?