为我的应用创建夜间主题

时间:2014-01-08 14:03:46

标签: ios iphone objective-c xcode ios7

我是iOS开发的新手,想知道如何添加类似于tweetbot 3的夜间主题并清除。根据我的研究,我还没有找到关于iOS应用程序的任何内容。

我会在另一个专门针对主题的故事板中重新制作应用吗?

感谢。

1 个答案:

答案 0 :(得分:16)

要添加其他人所说的内容,有一个关于代码的WWDC视频。我已经采取了更进一步的步骤,为我在几个应用程序中使用的主题创建了一个轻量级框架。要点如下。

每次创建标签,按钮等(或者当它们将出现在屏幕上时,如果您使用界面构建器),则将它们传递给设置其外观的Theme实例。如果多个UI组件协同工作,请使用Facade设计模式将它们组合到一个对象中(例如,如果您的按钮具有客户包装器,标签和特定位置的图像,请将它们包装到一个叫做的类 - 例如 - WrappedButton)。

我有时会发现用uml更容易沟通,所以......

Theme UML Diagram

主题协议可能看起来像这样。

@protocol Theme <NSObject>

- (void)themeHeadingLabel:(UILabel *)headingLabel;
- (void)themeBodyLabel:(UILabel *)bodyLabel;

- (void)themeNavigationButton:(UIButton *)navigationButton;
- (void)themeActionButton:(UIButton *)actionButton;

@end

顺便说一句,我通常会将代码放在那里以允许按钮,标签等响应iOS7中的文本大小更改(来自“设置”应用)。所以也可能有像

这样的方法
- (void)respondToTextSizeChangeForHeadingLabel:(UILabel *)headingLabel;
- (void)respondToTextSizeChangeForBodyLabel:(UILabel *)bodyLabel;

// and do the same for buttons

然后,当然,您将拥有该协议的一个或多个实现。这是您的主题将存在的地方。以下是一些可能看起来像什么的片段。

#import "Theme.h"

@interface LightTheme : NSObject <Theme>

@end

@implementation LightTheme

- (void)themeHeadingLabel:(UILabel *)headingLabel
{
    headingLabel.backgroundColor = [UIColor lightTextColor];
    headingLabel.textColor = [UIColor darkTextColor];

    headingLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
}

// the rest of your theming

@end

你可以有一个黑暗的主题,其实现看起来像这样。

@implementation DarkTheme

- (void)themeHeadingLabel:(UILabel *)headingLabel
{
    headingLabel.backgroundColor = [UIColor darkGrayColor];
    headingLabel.textColor = [UIColor lightTextColor];

    headingLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
}

// the rest of your theming

@end

我总是将它包装在 ThemeManager中,以帮助我跟踪主题。这可能看起来像这样。

#import "Theme.h"

@interface ThemeManager : NSObject

+ (id <Theme>)theme;

@end


#import "LightTheme.h"
#import "DarkTheme.h"

@implementation ThemeManager

+ (id <Theme>)theme
{
    // here you'd return either your light or dark theme, depending on your program's logic
}

@end

现在,要将它们组合在一起,您可以直接使用或在工厂中使用。

UILabel* headingLabel = [[UILabel alloc] init];
headingLabel.text = @"My Heading";

[[ThemeManager theme] themeHeadingLabel:myHeading];

// use the label

作为工厂,实现看起来像这样

- (UILabel *)buildLabelWith:(NSString *)text
{
    UILabel* headingLabel = [[UILabel alloc] init];
    headingLabel.text = text;

    [[ThemeManager theme] themeHeadingLabel:myHeading];

    return headingLabel;
}

希望有所帮助。如果您有任何疑问,请与我们联系。