如何为不同的状态设置UIButton的相同标题颜色?

时间:2015-04-28 12:57:30

标签: ios objective-c cocoa-touch uibutton uicolor

我创建了send_file的实例,并希望为UIButton州,Normal州和Selected州设置标题颜色。而我这样做 -

Highlighted

使用上面的代码,当我构建并运行应用程序时,文本会按照预期显示为红色。

但是当我在一个语句中为所有状态设置按钮的标题颜色为 -

[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState: UIControlStateSelected];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];

构建并运行应用程序......

问题

按钮上的文字显示为白色。

这是(上述陈述)不是设置[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal | UIControlStateSelected | UIControlStateHighlighted]; 标题颜色的正确方法吗?我是否需要在三个不同的陈述中设置UIButton的标题颜色?

欢迎任何建议/帮助!

非常感谢提前。

4 个答案:

答案 0 :(得分:2)

只需将titleColor设置为正常状态

即可
 [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

 button.tintColor = [UIColor redColor];

答案 1 :(得分:2)

UIControlState定义为

typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal       = 0,
UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
UIControlStateDisabled     = 1 << 1,
UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use
};

写作时

[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal | UIControlStateSelected | UIControlStateHighlighted];

这实际上意味着您正在为状态0x00000101设置红色。 Button永远不会处于此状态,因为它未定义。所以行为也是未定义的。

答案 2 :(得分:1)

您需要了解位掩码的工作原理。 Merlin指出了正确的方向,但他实际上没有给出解释。

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use
};

UIControlStateNormal是默认状态。它并没有真正使用位掩码。 UIControlStateHighlighted中的UIControlStateDisabledUIControlStateSelectedENUM个国家/地区正在使用位掩码,因此可以按照您在OP中的方式使用。

例如,请查看ENUM的{​​{1}}:

UIUserNotificationType

typedef NS_OPTIONS(NSUInteger, UIUserNotificationType) { UIUserNotificationTypeNone = 0, // the application may not present any UI upon a notification being received UIUserNotificationTypeBadge = 1 << 0, // the application may badge its icon upon a notification being received UIUserNotificationTypeSound = 1 << 1, // the application may play a sound upon a notification being received UIUserNotificationTypeAlert = 1 << 2, // the application may display an alert upon a notification being received } NS_ENUM_AVAILABLE_IOS(8_0); 不是一点掩饰。您不会同时注册声音,徽章和无类型的通知。没有,其他人必须是排他性的(各种异或)。

同样适用于UIUserNotificationTypeNoneUIControlState不得与其他州一起使用。您可以以任意组合使用位掩码值,但如果您引入甚至一个非位掩码值,结果将是您不会期望的结果。对于您的具体情况,Merlin给出了将非位掩码值与其他位掩码一起使用的确切结果。

简而言之,如果您使用UIControlStateNormal,请设置UIControlStateNormal。否则,仅使用位掩码值。

答案 3 :(得分:0)

您也可以使用故事板进行这些操作。

button properties

从状态配置属性,您可以选择所需的任何状态,并相应地设置不同的属性。