在应用程序的两种配色方案之间切换?

时间:2015-06-23 02:44:10

标签: objective-c

例如,我希望白天的所有视图(背景和标签)都有浅色,晚上则需要深色。该应用程序将根据时间自动更改其颜色。此外,用户还可以在设置中切换到其他配色方案。这样做最有效的方法是什么?

开关中涉及多种颜色(背景和标签)。

2 个答案:

答案 0 :(得分:6)

我最近做过一些非常相似的事情;应用程序需要各种用户可选择的配色方案。

主题

创建一个Theme类,其中包含每种颜色类型的属性。尽量避免描述具体用法(submitButtonBackgroundColor),而是描述目的(这样你最终会得到更少的颜色定义):

extern NSString * const ThemeChanged;

@interface Theme : NSObject

+ (Theme *)currentTheme;
+ (void)setCurrentTheme:(Theme *)theme;

@property (nonatomic, strong) UIColor *backgroundColor;
@property (nonatomic, strong) UIColor *foregroundColor;
@property (nonatomic, strong) UIColor *darkerForegroundColor;
@property (nonatomic, strong) UIColor *lighterForegroundColor;
@property (nonatomic, strong) UIColor *highlightColor;

@end

实现:

NSString * const ThemeChanged = @"ThemeChanged";

static Theme *_currentTheme = nil;

// Note this is not thread safe

@implementation Theme

+ (Theme *)currentTheme {
    return _currentTheme;
}

+ (void)setCurrentTheme:(Theme *)theme {
    _currentTheme = theme;

    [[NSNotificationCenter defaultCenter] postNotificationName:ThemeChanged object:nil];
}

@end

然后可以使用您想要的每个方案(一天一个,一个晚上)来实例化这个类。

每个视图控制器都需要访问[Theme currentTheme]才能检索颜色。他们(您的视图控制器)也可以注册为ThemeChanged通知的观察者,以便在您使用setCurrentTheme:更改主题时动态更新其视图的颜色。

日/夜检测

对于根据时间自动更新,您可以使用重复NSTimer合理间隔,检查当前时间并使用黑暗主题调用setCurrentTheme:你创建的对象。

@interface DayNightHandler : NSObject
@property (nonatomic, strong) NSTimer *timer;

@end

@implementation DayNightHandler

- (instancetype)init
{
    self = [super init];
    if (self) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                  target:self
                                                selector:@selector(checkTime)
                                                userInfo:nil
                                                 repeats:YES];
    }
    return self;
}

- (void)checkTime {
    NSDate *currentDate = [NSDate date];
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute
                                                                   fromDate:currentDate];

    NSLog(@"%@",components);

    // Very crude
    if (components.hour >= 18 || components.hour <= 6) {
        // set dark theme
    } else {
        // set light theme
    }
}

@end

您可能希望将原始日/夜检查换成更稳固的东西,这纯粹是一个旨在让您走上正确轨道的高级示例。

答案 1 :(得分:-3)

在AppDelegate.h文件中创建一个名为appColor的{​​{1}}类型的属性。 创建自定义getter,并添加逻辑以进行计时以及从设置中进行选择。

只需使用

设置颜色即可
UIColor

这将执行您的自定义getter方法并根据您的逻辑返回颜色。