2011-08-22 89 views
22

什么是推荐iOS应用程序样式的方法?例如,如果有多个标签或文本视图,在一个地方如何更新字体样式/颜色更新所有其他位置的样式/颜色?什么是推荐的iOS应用程序样式?

我知道子分类可能是一种方法...有没有其他方法?

+0

您可能需要查看此库。它支持动态多个主题/皮肤。目前支持图片和颜色。将来会添加字体支持。 https://github.com/charithnidarsha/MultiThemeManager –

回答

9

你可以导入一个标准的头文件到所有的控制器与造型...例如设置几个常数:

Styles.h

#define kFontSize 14 
#define kFontFamily @"Helevetica" 

控制器

#import "Styles.h" // at the top 

myLabel.font = [UIFont fontWithName:kFontFamily size:kFontSize]; 

我个人认为Interface Builder是风格的最佳方式,howe这直接回答你的问题。

+4

我不会downvote它,但...如果选择走这条路线,外部声明,如:'extern const CGFloat MONDarkThemeFontSize;'和'extern NSString * const MONDarkThemeFontName;'比'#define kShortName值'更可取,原因有很多。 – justin

+0

我宁愿因为我认为这是最简单的方法,非常适合我在工作的应用程序。感谢Alex和@Justin。 – Yogesh

+0

这不是一个好主意。 – DexterW

3

亚历克斯的想法类似,您可以创建一个名为ThemeManager静态类:

typedef enum 
{ 
    defaultStyle, 
    redStyle, 
} ThemeStyles; 

@interface Level : NSObject 
{ 
    ThemeStyles currentTheme; 
} 

可主题将导入ThemeManager所有课程。然后,您可以创建如下方法:

+ (UIColor*) fontColor; 

其他类在需要字体颜色时会调用哪些类。然后,如果你想改变的主题,你可以实现fontColor为:

+ (UIColor*) fontColor 
{ 
    switch (currentTheme) 
    { 
     case defaultStyle: 
     return [UIColor blackColor]; 
     case redStyle: 
     return [UIColor redColor]; 
    } 
} 

当你想改变的主题,你可以有ThemeManager实施等的方法:

+ (void) changeTheme:(ThemeStyles)newTheme 
{ 
    currentTheme = newTheme; 
} 
6

坦率地说,最好的关于这方面的方法是使用Interface Builder。尽管在代码的某处更改单个常量并让整个应用程序改变样式看起来不错,但它永远不会那么顺利。这里是我的推理:

1)开发人员不写界面代码以及界面生成器。 界面生成器是一个经过精心设计,经过测试并经过处理的工具。它提供了字体,文本对齐,阴影等。它可以向后兼容,只要你想要。它为任何数量的开发人员和设计人员提供了一种非常简单的方法,可以直接参与并处理一些非常简单的事情。

2)总是有一些边缘情况需要考虑。当然,一个简单的常量会做你最想要的时间,但是你最终必须在这里破解一些东西,并在那里偷偷摸摸。您开始编写的“简单”界面代码将会增长并不断增长。其他开发人员将不得不维护该代码。您将不得不维护该代码。你将不得不提交和修复错误,调整这个,除了这个,等等。它将不可避免地变成一团糟。

3)您编写的代码越多,写入的错误就越多。界面构建器用于构建大多数iOS应用程序的'外观'。用它。不要太聪明。

注意: 据我所知,界面生成器不能为所有应用程序做所有事情。有些情况下,编码接口是唯一的解决方案。这个答案只是我在大部分应用程序中使用的一般“最佳实践”。

+2

+1。只需制作不同风格的单独笔尖并重新加载视图即可。 –

+1

我仍然遇到需要通过Objective-C管理或设计UI的应用程序。很高兴知道如何去做。 – BlueConga

9

更新:我建议从理解UIAppearance API开始,看看它们能够满足您的需求。 UIAppearance是一种提供多个级别(例如全局或上下文)中特定控件属性的自定义默认样式的便捷方式。


我原来的答案,这早UIAppearance的可用性:


因为我们有一个基于对象的语言工作......

的实施,这取决于你希望如何表现/执行。当实现变得平淡无奇时,我会经常创建一个协议。你可以使用类方法或实例方法和显著,因为你创造较少的中间颜色,字体,图像等

优化这些类型为您的使用情况基本的接口可以采取以下形式:

@protocol MONLabelThemeProtocol 

- (UIFont *)labelFont; 
- (UIColor *)labelTextColor; 
- (UITextAlignment)labelTextAlignment; 
// ... 
@end 

@protocol MONTableViewCellThemeProtocol 

- (UIFont *)tableViewCellFont; 
- (UIColor *)tableViewCellTextColor; 
- (UIImage *)tableViewCellImage; 
- (NSInteger)tableViewCellIndentationLevel; 
- (CGFloat)tableViewCellIndentationWidth; 
// ... 
@end 

然后简单的合并将主题可以声明如下:

@interface MONAmalgamateThemeBase : NSObject 
    < MONLabelThemeProtocol, MONTableViewCellThemeProtocol > 
{ 
@protected 
    /* labels */ 
    UIFont * labelFont; 
    UIColor * labelTextColor; 
    UITextAlignment labelTextAlignment; 
    // ... 
    /* table view cells */ 
    UIFont * tableViewCellFont; 
    UIColor * tableViewCellTextColor; 
    UIImage * tableViewCellImage; 
    NSInteger tableViewCellIndentationLevel; 
    CGWidth tableViewCellIndentationWidth; 
    // ... 
} 

@end 
在这个例子中

,该合并将定义getter和dealloc中,预计子类初始化实例变量。如果初始化时间很长(例如使用很多图像),您也可以支持延迟初始化。

然后专业化可以采取以下形式:

@interface MONDarkTheme : MONAmalgamateThemeBase 
@end 

@implementation MONDarkTheme 

- (id)init 
{ 
    self = [super init]; 
    if (nil != self) { 
     labelFont = [[UIFont boldSystemFontOfSize:15] retain]; 
     labelTextColor = [[UIColor redColor] retain]; 
     // and so on... 
    } 
    return self; 
} 

// ... 

@end 

/* declare another theme and set it up appropriately */ 
@interface MONLightTheme : MONAmalgamateThemeBase 
@end 

然后只是重复使用整个应用程序的主题的实例(例如MONDarkTheme)风格化的观点。如果你有很多主题或者他们不是微不足道的构建,那么你可能想创建一个主题集合(主题管理器)。如果您的需求很简单,合并器也可以采用一个参数,例如带主题的init。如果您需要支持动态更改,则甚至可以配置对象以注册主题更改。

最后,你可以创建一个简单的主题施加使生活更轻松 - 像这样:

@interface UILabel (MONThemeAdditions) 

- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme; 

@end 

@implementation UILabel (MONThemeAdditions) 

- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme 
{ 
    assert(theme); 
    if (nil == theme) return; 
    self.font = [theme labelFont]; 
    self.textColor = [theme labelTextColor]; 
    self.textAlignment = [theme labelTextAlignment]; 
} 

@end 
+0

我喜欢这个答案,虽然它很老。现在我们拥有UIAppearance API的适用性如何? – bandejapaisa

+0

@bandejapaisa我已经更新了我的答案。在iOS7中有105次出现了'UI_APPEARANCE_SELECTOR' - 对于大多数应用程序的需求都有足够的控制。如果您需要更多粒度或控制内存,属性,样式或应用程序功能(实际上,我刚刚开始了可能性),那么上述方法可以为您提供所有可用的控制。我也喜欢它,因为它不一定是全球性的,也不是侵入性的。我看到了类似的方法,但是'UIAppearance'倾向于方便,而我的倾向是控制。另外,我倾向于编写用户界面... – justin

+0

@bandejapaisa ...以编程方式,所以这往往是一个反复出现的问题与高地方(当所有的细节存在于同一个地方很容易应用和推动主题)。当细节存在于多个地方时 - 当您合并故事板,XIB和一些代码时,它变得更加困难。不过,当初始化从源代码移动到SB/XIB加载时,引入和应用这些程序化主题将不太方便。在这种情况下,您可能会覆盖仅适用于主题。 – justin

1

我用的Plist。就像我本地化字符串一样,我使用相同的过程来更改主题。我编写了一个加载当前主题plist和备用plist的单身人士。然后,我用键和宏函数替换资源的名称,这些函数从单例中抽取实际资源名称。

缺点:您必须为每个元素设置资源,而不是将其设置在NIB中。
优点:一旦你完成,下一个主题大部分涉及Photoshop和textmate,而不是IB或代码。

3

可以使用UIAppearance的第三方抽象:

使用故事板有很多的好处,但是许多样式选项不可用,其中最重要的是自定义字体。如果你想要一个深度定制的UI,你将需要一些样式代码来实现它。

相关问题