什么是推荐的iOS应用程序样式?

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

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

你可以导入一个标准的头文件到你的所有控制器中设置了几个常量的样式…例如:

Styles.h

#define kFontSize 14 #define kFontFamily @"Helevetica" 

调节器

 #import "Styles.h" // at the top myLabel.font = [UIFont fontWithName:kFontFamily size:kFontSize]; 

我个人认为Interface Builder是最好的风格,但是这直接回答你的问题。

更新:我build议先了解UIAppearance APIs,并看看它们是否适合您的需求。 UIAppearance是在多个级别(例如全局或上下文)中提供特定控件属性的自定义默认风格化的一种便捷方式。


我原来的回答,这是早于UIAppearance的可用性:


因为我们正在使用基于对象的语言…

对于实现,这取决于你想如何performance/执行。 当实现变得平淡时,我会经常创build一个协议。 您可以使用类方法或实例方法,并根据您的使用显着优化这些types,因为您创build的中间颜色,字体,图像等较less。

一个基本的界面可以采取如下forms:

 @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,并期望子类初始化实例variables。 如果初始化时间很长,你也可以支持延迟初始化(例如,使用许多图像)。

那么专业化可以采取以下forms:

 @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)来devise风格。 如果你有很多的主题,或者他们不是微不足道的构build,那么你可能想要创build一个主题集合(主题pipe理器)。 如果你的需求很简单,合并器也可以带一个参数,比如带有主题的init。 如果您需要支持dynamic更改,则甚至可以configuration对象以注册主题更改。

最后,你可以创build一个简单的主题应用程序,使生活更轻松 – 就像这样:

 @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 

坦率地说,最好的方法是使用Interface Builder。 尽pipe在代码的某个地方改变一个常量并且让整个应用程序改变样式看起来不错,但是从来没有这样做过。 这是我的推理:

1)开发人员不像接口生成器那样编写接口代码。 界面生成器是经过多年改进,testing和处理的工具。 它提供了字体,文本alignment方式,阴影等,它可以向后兼容,只要你想要的东西。 它为任何数量的开发人员和devise人员提供了一个非常简单的方法,可以直接进入并处理一些非常简单的事情。

2)总是有些情况需要考虑。 当然,一个简单的常数会做你最想做的事情,但是你最终不得不在这里偷偷摸摸一些东西。 你写的“简单”的界面代码将会增长并且增长。 其他开发人员将不得不维护该代码。 你将不得不维护这个代码。 你将不得不提交和修复错误,调整这个,除了,等等。它将不可避免地成为一堆乱七八糟的东西。

3)你写的代码越多,你写的错误就越多。 界面构build器是为了构build大多数iOS应用程序的“外观”。 用它。 不要太聪明

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

与Alex的想法类似,您可以创build一个名为ThemeManager的静态类:

 typedef enum { defaultStyle, redStyle, } ThemeStyles; @interface Level : NSObject { ThemeStyles currentTheme; } 

所有可以为主题的类将导入ThemeManager。 然后,你可以创build如下的方法:

 + (UIColor*) fontColor; 

当他们想为他们的字体设置颜色时,哪些其他类将会调用。 那么,如果你想改变主题,你可以实现fontColor为:

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

当你想改变主题,你可以让ThemeManager实现一个方法如下:

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

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

  • NUI : https : //github.com/tombenner/nui
  • Pixate : http : //www.pixate.com

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

我使用plists。 就像我本地化string,我使用相同的过程来改变主题。 我编写了一个加载当前主题plist和备用plist的单身人士。 然后我用键和macros函数来replace资源的名称,这些函数从单例中抽取实际的资源名称。

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

你可能需要看这个库。 它支持dynamic多个主题/皮肤。 目前支持图片和颜色。 将来会添加字体支持。

https://github.com/charithnidarsha/MultiThemeManager