您好我正在尝试使用主题切换器编写一些iPhone应用程序,用户可以选择主题来更改背景颜色,alpha,图像和一些按钮的外观和感觉(大小,图像,甚至位置)。
应用主题的最佳方式是什么?
谢谢, 添
答案 0 :(得分:6)
以下是我如何实现改变FemCal主题的能力。我已经以代码片段的形式包含了一些细节。
创建一个存储颜色,图像等的单例ThemeMgr类。在需要时获取单例。
@interface ThemeMgr : NSObject
{
// selected color and image
NSString * selectedColor;
NSString * selectedPicture;
// dictionaries for color and image
NSDictionary * colorData;
NSDictionary * imageData;
NSDictionary * backgroundData;
// names
NSArray * colors;
NSArray * images;
// themes
UIColor * tintColor;
UIImageView * panelTheme;
UIColor * tableBackground;
}
使用通知广播主题更改。我使用@“ThemeChange”作为通知。
- (void)fireTimer:(NSTimer *)timer
{
NSNotification * themeChange = [NSNotification notificationWithName:@"ThemeChange" object:nil];
[[NSNotificationQueue defaultQueue] enqueueNotification:themeChange postingStyle:NSPostWhenIdle];
}
显然,您将有一些UI来选择所需的主题。
在这种情况下,用户选择一个主题,并在0.5秒后触发fireTimer
。在强制UI重绘之前,这为其他UI提供了一个很好的延迟。
在需要处理主题更改的任何位置收听通知。
// listen for change notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateAppearance:) name:@"ThemeChange" object:nil];
我只有几个视图,所以我在我使用的每个控制器中编写了代码,但你可以使用objective-C的强大功能来混合代码以更好的方式处理它。< / LI>
实施代码以根据主题实际重绘视图。
- (void)updateAppearance:(NSNotification *)notification
{
// background for grouped table view
ThemeMgr * themeMgr = [ThemeMgr defaultMgr];
// change color and reload
[self.tableView setBackgroundColor:[themeMgr tableBackground]];
[self.tableView reloadData];
self.navigationController.navigationBar.tintColor = [themeMgr tintColor];
}
不要忘记在必要时撤消任何通知,并且您必须在viewDidLoad或类似代码中编写代码以在显示视图之前应用任何主题。
答案 1 :(得分:0)
没有得到任何答案。我用事件和singlton实现了它。基本上,单例设置对象会将更改分派给观察者,观察者会根据事件更新GUI。 我记得有一种方法可以听取实例变量的变化,但忘了怎么做。无论如何,我目前的方式对我来说非常好。