例如,我希望白天的所有视图(背景和标签)都有浅色,晚上则需要深色。该应用程序将根据时间自动更改其颜色。此外,用户还可以在设置中切换到其他配色方案。这样做最有效的方法是什么?
开关中涉及多种颜色(背景和标签)。
答案 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方法并根据您的逻辑返回颜色。