30

我有一个 iPhone 应用程序,为我的主题提供了一些自定义颜色。由于这些颜色将为我的 UI 固定,因此我想在要包含的类中定义颜色(Constants.h 和 Constants.m)。我怎么做?(简单地定义它们不起作用,因为 UIColors 是可变的,并且会导致错误 - Initalizer 不是常量)。

/* Constants.h */
extern UIColor *test;

/* Constants.m */
UIColor *test = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];

谢谢!

4

7 回答 7

48

UIColor 是不可变的。我通常用颜色、字体和图像来做这件事。您可以轻松地将其修改为使用单例或具有静态初始化程序。

@interface UIColor (MyProject)

+(UIColor *) colorForSomePurpose;

@end

@implementation UIColor (MyProject)

+(UIColor *) colorForSomePurpose { return [UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]; }

@end
于 2010-05-13T04:18:01.060 回答
32

为简单起见,我这样做了:

/* Constants.h */
#define myColor [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0]

不要忘记省略';' 因此您可以将其用作普通表达式。

我不确定这种方法在技术上是否有任何问题,但它工作正常,并且避免了编译时常量初始化程序错误——这段代码有效地卡在你放置“myColor”的任何地方,所以它永远不会得到编译直到你真正使用它。

于 2013-05-01T13:29:56.307 回答
14

另外一个选项

在你的 .h 你可以做

extern UIColor *  const COLOR_LIGHT_BLUE;

在你的 .mm 你可以做

UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255  blue:1 alpha:1];//;#15B4FF
于 2012-01-06T15:38:20.940 回答
6

如果您正在寻找一个没有扩展的快速而肮脏的工具,请使用clang

#define kGreenColor colorWithRed:(0/255.0) green:(213/255.0) blue:(90/255.0) alpha:1.0

- (void)doSomething
{
   _label.textColor = [UIColor kGreenColor];

}
于 2014-10-25T19:42:46.570 回答
0

人们经常将全局常量放入单例对象中——或者如前所述,您可以通过某个类的类方法使它们可访问。

于 2010-05-13T04:20:51.097 回答
0

这是另一种方式:

标题:

#if !defined(COLORS_EXTERN)
    #define COLORS_EXTERN extern
#endif

COLORS_EXTERN UIColor *aGlobalColor;

执行:

#define COLORS_EXTERN
#import "GlobalColors.h"


@interface GlobalColors : NSObject
@end

@implementation GlobalColors

+ (void)load
{
    aGlobalColor = [UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1];
}

@end

这有点 hack,但是您不需要在实现中重新定义颜色,并且无需方法调用即可访问颜色。

于 2014-12-04T10:14:30.643 回答
-2

使用 AppController 使颜色可全局访问,而不是静态变量。这样从架构的角度来看是有意义的,而且如果您想假设更改配色方案,即使在运行时,这也只是 AppController 上的一两个方法

于 2010-05-13T04:25:03.647 回答