如何定义 UIColor 的常量值?
Posted
技术标签:
【中文标题】如何定义 UIColor 的常量值?【英文标题】:How do I define constant values of UIColor? 【发布时间】:2011-02-12 16:39:54 【问题描述】:我想做这样的事情,但我无法获得合作语法。
static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];
我想我可以定义宏,但它们很丑。
【问题讨论】:
是的,Objective-C 更具体的语言——但在这种情况下它是在 iPhone 上。static UIColor *const color = ....
在 Objective-C++ 中是可能的。只需更改 *.mm
的扩展名即可。
【参考方案1】:
我喜欢使用类别来扩展类,并为这类事情提供新方法。下面是我今天刚刚写的一段代码:
@implementation UIColor (Extensions)
+ (UIColor *)colorWithHueDegrees:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness
return [UIColor colorWithHue:(hue/360) saturation:saturation brightness:brightness alpha:1.0];
+ (UIColor *)aquaColor
return [UIColor colorWithHueDegrees:210 saturation:1.0 brightness:1.0];
+ (UIColor *)paleYellowColor
return [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
@end
现在我可以在代码中执行以下操作:
self.view.backgroundColor = highlight? [UIColor paleYellowColor] : [UIColor whitecolor];
我自己定义的颜色与系统定义的颜色完全吻合。
(顺便说一句,由于我更关注颜色,因此我开始更多地考虑 HSB 而不是 RGB。)
关于预先计算价值的更新:我的直觉是它不值得。但如果你真的想要,你可以用静态变量来记忆值:
+ (UIColor *)paleYellowColor
static UIColor *color = nil;
if (!color) color = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
return color;
你也可以制作一个宏来做记忆。
【讨论】:
我喜欢这种方法。它完成了我在定义和使用中寻找的组织。我不熟悉(扩展),我将不得不阅读它,因为它可能适用于我正在使用的其他一些类。最后,(可能会加班),是否有像 RBG 选择器一样的 HSB“选择器”实用程序。我喜欢 IB,但我发现将互补色放在一起会很有帮助,因为我经常一次想要不止一种颜色。 哦,是的,但我试图解决的一个问题是获取预先计算的值。我不想每次引用颜色时都执行三个分割。 重新选色:我不是专家。我在 Interface Builder 中使用颜色选择器。它有一个色轮、RGB 或 HSB 的滑块,还有一个蜡笔盒。我喜欢它。 将以上代码保存在 UIColor_MyColors.m 中,然后创建 UIColor_MyColors.h 并使用:#import <UIKit/UIKit.h> @interface UIColor () + (UIColor *) aquaColor; @end
导入 UIColor_MyColors.h #import "UIColor_QuizColor.h"
并引用这样的颜色:[self.view setBackgroundColor: [UIColor aquaColor]];
跨度>
如果你习惯使用像 (255,255,255) 这样的 RGB,你可以更改使用 web 将 RGB 转换为色调值 (serennu.com/colour/hsltorgb.php) 或将此函数添加到上述代码 + (UIColor *)colorWithWebRed:(CGFloat)red Green:(CGFloat)green Blue:(CGFloat)blue return [UIColor colorWithRed:red/255 green:green/255 blue:blue/255 alpha:1.0];
并使用就像这样+ (UIColor *) aquaColor return [UIColor colorWithWebRed:59 Green:89 Blue:152];
【参考方案2】:
我通常为每个项目做一个 UIColor 的类别:
@interface UIColor (ProjectName)
+(UIColor *) colorForSomeTable;
+(UIColor *) colorForSomeControl;
+(UIColor *) colorForSomeText;
@end
在实现中使用常量:
@implementation UIColor (ProjectName)
+(UIColor *) colorForSomeTable return [UIColor colorWithRed:...];
@end
我也会根据需要对 UIFont 和 UIImage 执行相同的操作。
【讨论】:
太棒了!我的附属问题是,把这段代码放在哪里?我有 Constants.h/Constants.m 文件(在我的预编译头文件中),我只是想“声明”一个常量颜色......我不喜欢把这种代码放在那里......你会把它放在哪里? 恕我直言,这是要走的路。【参考方案3】:如果您想预先计算值(或只执行一次),请扩展 jasoncrawford 的答案(我会将其作为注释放入,但您不能在 cmets 中格式化代码)。
+ (UIColor *)paleYellowColor
static UIColor* paleYellow = nil;
if (paleYellow == nil)
paleYellow = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
return paleYellow;
您最初的想法不起作用的原因是编译器只能在函数之外使用初始化程序,而不是普通代码。你可以用初始化方法实现你想要的东西,例如
static UIColor* colorNavBar = nil;
+(void) initialize
if (colorNavBar != nil)
colorNavBar = ....
注意,原始定义中的 const
限定符是多余的,因为 UIColor
无论如何都是不可变的。
【讨论】:
感谢所有好的提示和技巧。我可能会在我的其他一些更特定于应用程序的设计任务中遵循这种模式。我正在使用 Jason 第一篇文章中建议的类/类别。这允许一种优雅的方式来定义各种颜色的主题类。 .. 哦,是的,至于不可变的 const —— 是的,明白了!感谢您指出。【参考方案4】:你可以这样做:
#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
【讨论】:
当有更类型安全或编译器安全的替代方案可用时,我会避免使用宏解决方案。您可能会注意到,在我最初的描述中,我承认有一个“宏观”解决方案,但它们是“丑陋的”。丑陋出现在这种情况下,因为使用语言的类别功能有一个干净的解决方案。【参考方案5】:您可以像这样“定义”一个类似的 CONSTANT:
#define FAV_COLOR [UIColor colorWithRed:24/255.0f green:89/255.0f blue:36/255.0f alpha:0.9]
并像您习惯使用常量一样按名称调用它:FAV_COLOR
希望对您有所帮助。
【讨论】:
kasperfn 这与 intorpedro(上图)的答案相同。我更喜欢避免使用宏。我最喜欢的答案是类别答案,因为它是对语言的更好的 OO 使用。 对常量使用宏是一件坏事。 @IulianOnofrei 有什么具体原因吗?为什么宏观不好?有性能问题吗?请简述。【参考方案6】:#define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
myLabel.textColor=textColorApp;
【讨论】:
对不起 - 仍然是一个宏观解决方案。我更喜欢 Category 解决方案并扩展 UIColor 类。【参考方案7】:在 Swift 中,定义一个扩展:
extension UIColor
class func XXXWhiteColor() -> UIColor
return UIColor(red: 256, green: 256, blue: 256, alpha: 1.0)
class func XXXGreenColor() -> UIColor
return UIColor(red: 73/255.0, green: 212/255.0, blue: 86/255.0, alpha: 1.0)
像这样使用:
label.background = UIColor.XXXWhiteColor()
【讨论】:
【参考方案8】:只需在常量文件中定义以下宏并仅传递 RGB 值并在您想要的任何地方使用
#define RGBCOLOR(r,g,b)[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
使用方法:
[lblCount setTextColor:RGBCOLOR(236, 43, 92)];
【讨论】:
谢谢 - 但我还是更喜欢避免使用宏。我最喜欢的答案是类别答案,因为它是对语言的更好的 OO 使用。 我做了同样的事情,但在目标 c 中显示了预期的表达式错误【参考方案9】:我觉得还值得一提的是另一个很少被谈论的很棒的功能:颜色文字。它们不仅更易于阅读,而且更易于编辑。在 Swift 中,
let color: UIColor = #colorLiteral(red: 0.9607843137, green: 0.4784313725, blue: 0.3215686275, alpha:
当粘贴到 Xcode 中时,此语法会创建一个简单的颜色框。 Click here to see an example.
看到该框后,您可以双击它进行轻松编辑。同样,您可以在各种 IB 选项之间切换,包括 RGB Sliders,如果您有来自设计师的颜色十六进制值的特定列表。
【讨论】:
以上是关于如何定义 UIColor 的常量值?的主要内容,如果未能解决你的问题,请参考以下文章