定义全局颜色

6
我希望定义一个全局颜色,以便在各种自定义UI单元格的downstate中重复使用。
不确定这样做是否正确,但是...我已经定义了一个名为lightGreyUIColor的类,它有以下.h文件-
#import <UIKit/UIKit.h>

@interface lightGreyUIColor : UIColor
+ (UIColor*)lightGreyBGColor;

@end

并且这个 .m 文件 -

#import "lightGreyUIColor.h"

@implementation lightGreyUIColor

+ (UIColor*)lightGreyBGColor {
return [UIColor colorWithRed:241.0/255.0 green:241/255.0 blue:241/255.0 alpha:1];
}

@end

我已经在tableview的实现文件中包含了lightGreyUIColor.h文件,并尝试按以下方式引用它 -
        cell.backgroundColor = [UIColor lightGreyBGColor];

这只会产生一个关于lightgreyBGColor未知类或方法的错误,我做错了什么,有没有更好的实现全局样式的方法?


宏有什么问题? - amar
5个回答

24
你应该创建一个类别(Category),而不是一个子类。这将扩展UIColor类,并将你的颜色添加到其中。
.h
#import <UIKit/UIKit.h>

@interface UIColor (CustomColors)

+ (UIColor *)myColorLightGreyBGColor;

@end

.m

#import "UIColor+CustomColors.h"

@implementation UIColor (CustomColors)



+ (UIColor *)myColorLightGreyBGColor {

    static UIColor *lightGreyBGColor;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        lightGreyBGColor = [UIColor colorWithRed:241.0 / 255.0 
                                           green:241.0 / 255.0
                                            blue:241.0 / 255.0 
                                           alpha:1.0];
    });

    return lightGreyBGColor;
}

@end

通过这种方式定义你的颜色,并 #importing 类别,你可以像以前尝试的那样应用这个自定义颜色。

1
我会添加一个带有静态变量的 dispatch_once。这样,颜色就不会每次都被创建... - Lorenzo B
1
你应该给你的类别方法添加前缀,以避免与苹果可能添加的方法发生冲突。 - David Snabel-Caunt
很酷 - 所以我可以使用相同的方法来定义我们应用程序中的所有动态颜色吗?这种方法能否动态更改这些颜色 - 即如果用户选择了不同的颜色方案? - Dancer
@Dancer 你会想要定义在类别中所有的颜色,如上所示,并且根据需要应用哪种颜色(基于主题等)来实现动态效果。 - Mick MacCallum
@0x7fffffff,您能否解释一下在这种情况下制作类别的优点而不是使用宏的优点?我的意思是我想知道使用这种方法的好处。 - amar
1
@amar 使用新颜色时要考虑类型安全,但主要是因为使用这种方式创建颜色将会创建一个颜色对象的静态引用,而宏定义的方式在预处理期间将会将[UIColor colorWith...];复制粘贴到宏被引用的每个地方。 - Mick MacCallum

10

怎么样,使用一个宏?

#define DEFAULT_COLOR_BLUE [UIColor colorWithRed:.196 green:0.3098 blue:0.52 alpha:1.0]

将其放入您的appname_Prefix.pch文件中,或更可能地是包含在前缀文件中的头文件中。

就像这样:

cell.backgroundColor = DEFAULT_COLOR_BLUE;

2

你的类名是lightGreyUIColor

因此你需要将其用作:

cell.backgroundColor = [lightGreyUIColor lightGreyBGColor];

你需要在UIColor上创建一个类别。

编辑:

你的代码[UIColor lightGreyBGColor]试图在UIColor本身中搜索该方法,但是你已经通过lightGrayUIColorUIColor进行了子类化。

由于你的调用看起来像你打算使用一个类别。

附注: ClassName应该是大写的LightGreyUIColor


1

您需要的是一个类别。在这里阅读相关信息。

在您的情况下,您需要像这样的内容:
UIColor+Grey.h

@interface UIColor (Grey) 

+(UIColor*) lightGreyBGColor;
@end

UIColor+Grey.m

#import "UIColor+Grey.h"

@implementation UIColor (Grey)

+(UIColor*) lightGreyBGColor {
     //define color
}

然后,在您的控制器中,您将调用它如下:
cell.backgroundColor = [UIColor lightGreyBGColor];

1

在WWDC中也有这里 https://devblog.xero.com/managing-ui-colours-with-ios-11-asset-catalogs-16500ba48205 - Nick T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接