使用 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

使用 UIAppearance 在更改后更新导航栏

iOS开发之App主题切换完整解决方案(Swift版)

如何使 UIAppearance 代理适用于以编程方式创建的视图?

如何在MonoTouch中为继承的视图创建UIAppearance代理?

毕业设计心得与整理-APP-主题切换