分离 UIAppearence 代码

Posted

技术标签:

【中文标题】分离 UIAppearence 代码【英文标题】:Separating UIAppearence code 【发布时间】:2014-01-23 19:18:25 【问题描述】:

我想为我正在创建的应用程序添加主题。只需在 2 种颜色之间切换,我希望导航栏、工具栏等以所选颜色显示。

当应用首次加载时,我在 AppDelegate 的 didFinishLaunchingWithOptions 方法中应用一种颜色。

UIColor *blueTheme = [UIColor colorWithRed:80/255.0f green:192/255.0f blue:224/255.0f alpha:1.0f];
UIColor *pinkTheme = [UIColor colorWithRed:225/255.0f green:87/255.0f blue:150/255.0f alpha:1.0f];

[[UINavigationBar appearance] setBarTintColor:pinkTheme];
[[UIToolbar appearance] setBarTintColor:pinkTheme];

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

在第一个视图控制器中,我放置了一个分段控件来切换颜色。

- (IBAction)themeChosen:(UISegmentedControl *)sender

    if (sender.selectedSegmentIndex == 0) 
        UIColor *blueTheme = [UIColor colorWithRed:80/255.0f green:192/255.0f blue:224/255.0f alpha:1.0f];

        [[UINavigationBar appearance] setBarTintColor:blueTheme];
        [[UIToolbar appearance] setBarTintColor:blueTheme];
     else 
        UIColor *pinkTheme = [UIColor colorWithRed:225/255.0f green:87/255.0f blue:150/255.0f alpha:1.0f];

        [[UINavigationBar appearance] setBarTintColor:pinkTheme];
        [[UIToolbar appearance] setBarTintColor:pinkTheme];
    
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

假设默认主题是粉红色。我从分段控件切换到蓝色并推送到下一个视图控制器,其中也有一个UIToolBar。新选择的颜色(蓝色)仅应用于UIToolBar,而不应用于UINavigationBar

有没有更好的方法来解决这个问题?另外我想把与主题相关的代码放在一个单独的类中,因为它重复了很多代码。我该怎么做?

谢谢。

【问题讨论】:

【参考方案1】:

您遇到的问题是由于UIAppearance 仅在下一次创建 UI 控件时生效。你的新UIToolbar 呈现出新的外观,因为当你推送一个新的视图控制器时,它有一个全新的工具栏。您的 UINavigationBar 没有改变,因为它是在创建您的导航控制器视图时创建的,并且不会更新其外观。

您还必须直接在您的navigationController 的navigationBar 上更新该属性。例如:

self.navigationController.navigationBar.barTintColor = blueTheme;

【讨论】:

我明白了。我现在知道了。谢谢:)

以上是关于分离 UIAppearence 代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIAppearence 代理设置字体无处不在

使用 UIAppearence 更改 UIViewController 的直接子视图的背景颜色

使用 UIAppearence 设置 UITableViewCell 选择的背景颜色不起作用

UIAppearence 仅适用于 iOS 中的系统颜色?

IOS下移除按钮原生样式 -webkit-appearance

VB里的Button 按钮代码怎么写成多选按钮的那种