2012-01-11 63 views
6

我有几个使用Inteface Builder创建的黄色按钮。所有颜色都一样。目前我在每个xib中声明颜色。我可以在全球范围内宣布它并在所有xib中重复使用吗?我可以在Interface Builder中重用颜色吗?

+1

“界面构建器”中的每个人都回答了这个问题的每个人都无法理解?奇怪的。 – 2013-08-11 14:11:22

+1

@MarkAmery这意味着,唯一的方法是使用_code_。 – Tricertops 2013-08-11 16:25:30

+0

真的很无聊,没有办法做到这一点。谁想要在IB中逐个调整100页的颜色? – Jonny 2015-12-07 14:15:58

回答

-1

绝对是!

创建一个单独的对象(你可以叫它OksanaColor,要冷静)...

...或者,如果你真懒,只读属性UIColor,您可以从您的访问应用程序委托。

-1

您也可以在UIColor上添加一个类别,这样您就可以像使用UIColor一样使用它。例如,在我的应用程序中,我添加了一个名为ApplicationColors的新文件,其中包含我所有的应用程序颜色。

@interface UIColor (ApplicationColours) 

+(UIColor *)savaColor; 

@end 

实现:

@implementation UIColor (ApplicationColours) 

+(UIColor *)savaColor 
{ 
    return [UIColor colorWithRed:228.0f/255.0f green:86.0f/255.0f blue:86.0f/255.0f alpha:1.0f]; 

} 

@end 

然后用它在我的应用程序,我导入ApplicationColours.h并使用相同的任何其他的UIColor。即:

label.textColor = [UIColor savaColor]; 
+1

您可能希望使+ savaColor为该颜色保留一个静态变量,以便它不会每次都创建一个新实例。 – NSResponder 2012-01-11 09:45:04

+0

是的好思想@NSResponder从来没有想过的:) – 2012-01-11 09:52:09

+2

我不想在代码中做到这一点。我想在界面构建器中设置。 – Oksana 2012-01-13 06:45:14

-2

这是UIColor的命名颜色类别的一个非常简单的实现。有了这个代码在你的项目中,UIColor会记住你要保存的所有颜色,并让你访问你自己的颜色或系统颜色使用+colorWithName:

@interface UIColor (namedColors) 

+ (UIColor *) colorWithName:(NSString *) name; 
+ (void) setColor:(UIColor *) color forName:(NSString *) name; 

@end 

static NSMutableDictionary *colorStorage; 

@implementation UIColor (namedColors) 

+ (NSMutableDictionary *) colorStorage 
{ 
    if (!colorStorage) 
    colorStorage = [[NSMutableDictionary alloc] initWithCapacity:10]; 
    return colorStorage; 
} 

+ (UIColor *) colorWithName:(NSString *) name 
{ 
    UIColor *result =[[self colorStorage] valueForKey:name]; // See if we have a color with this name in the colorStorage. 

    if (result) return result; 

    SEL selector = NSSelectorFromString(name); // look for a class method whose selector matches the given name, such as "blueColor" or "clearColor". 

    if ([self respondsToSelector:selector] && (result = [self performSelector:selector])) 
    if ([result isKindOfClass:[self class]]) 
     return result; 

    return nil; 
} 

+ (void) setColor:(UIColor *) color forName:(NSString *) name 
{ 
    [[self colorStorage] setValue:color forKey:name]; 
} 

@end 
+0

也许太复杂了?简单的'[UIColor myRedColor]'或'[UIColor anotherRedColor]'就足够简单了,不是吗? – Tricertops 2013-08-11 16:31:30

3

是的,你可以做到这一点。

在Interface Builder的颜色选择器弹出框的底部,有一排正方形可用于存储颜色供以后使用。从颜色选择器顶部显示当前颜色的矩形中拖出一个颜色存储它,然后稍后单击存储的颜色以使用它。

diagram showing how to save colors

+1

当您决定更改颜色时,这将不允许您重新涂抹颜色。但这是保存颜色以供手动重复使用的唯一原始方式。 – Tricertops 2013-08-11 16:26:52

+0

@iMartin你说得对,这是一个问题,我没有考虑它。但是,使用这种方法时,仍然可以在全局范围内交换颜色。如果要在故事板中更改颜色,只需在Storyboard的底层XML(或项目中的所有XIB)中查找并替换代表该颜色的所有标记。这是一种黑客攻击,但它会起作用,而且这不是你需要经常做的事情。 – 2013-08-12 10:27:45

7

在Interface Builder 不可能的。在代码中执行此操作,例如通过创建按钮的特殊子类。

您可以使用系统调色板来保存颜色,但是您仍然需要在每次决定更改时将其应用于所有按钮。或者您可以在颜色选择器中使用“最近使用的颜色”,但这两种方式都不够动态。

+0

谢谢你真的回答了这个问题。 – KPM 2015-03-09 13:54:54

1

不幸的是我不相信有一种方法可以完全在界面生成器中完成。但是,你可以用一点代码来贴近。我发现能够改变整个应用程序的颜色在一个最好的方式是继承您要的颜色(的UILabel,例如)的项目在初始化设置颜色:

@interface HuedUILabel : UILabel 
@end 

@implementation HuedUILabel 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // Initialization code 
     self.textColor = [AppConfig primaryColor]; 
    } 
    return self; 
} 

@end 

然后,将标签设置为在IB自定义类:

现在,当你想改变你所有的UILabels的颜色,你可以通过改变你的一种颜色高清做到这一点,你不这样做不得不用一堆外观分配来混淆你的代码。

相关问题