分离UIAppearence代码

时间:2014-01-23 19:18:26

标签: ios themes uinavigationbar uicolor uiappearance

我想为我正在创建的应用实现添加主题。只需在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 个答案:

答案 0 :(得分:3)

您遇到的问题是UIAppearance仅在创建UI控件时生效。您的新UIToolbar采用了新的外观,因为当您推送新的viewcontroller时,它会有一个全新的工具栏。您的UINavigationBar没有变化,因为它是在创建导航控件的视图时创建的,并且不会更新其外观。

您还必须直接在navigationController的navigationBar上更新属性。 e.g:

self.navigationController.navigationBar.barTintColor = blueTheme;