2015-04-28 3 views
0

Я создал экземпляр UIButton и хочу установить цвет заголовка для Normal состояние, Selected состояние и Highlighted состояние. И я делаю так как-Как установить одинаковый цвет заголовка UIButton для разных состояний?

[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 и мне нужно установить цвет заголовка UIButton в трех разных операторах?

Любые предложения/помощь приветствуются!

Большое спасибо заранее.

+0

только что установлен Цвет оттенка –

+1

Из вашей попытки: 'В общем случае, если свойство не указано для состояния, по умолчанию используется значение UIControlStateNormal. Если значение UIControlStateNormal не установлено, то по умолчанию значение по умолчанию соответствует системному значению. Поэтому, как минимум, вы должны установить значение для нормального состояния. ' – Larme

+0

Ваш вопрос выглядит следующим образом: http://stackoverflow.com/questions/4370466/uibutton-settitleforstate-question – Mrunal

ответ

1

Вам нужно понять, как работают матовые маски. Мерлин указал в правильном направлении, но он фактически не дал объяснений.

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, UIControlStateDisabled, UIControlStateSelected в ENUM используют битовые маски, поэтому их можно использовать так, как вы делали в своем OP.

Например, взгляните на ENUM для 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); 

UIUserNotificationTypeNone не битовую маску. Вы не регистрируетесь для уведомлений о типах Sound, badge и none одновременно. Нет, и другие должны быть эксклюзивными (XOR).

То же самое касается UIControlState. UIControlStateNormal не может использоваться с другими состояниями. Вы можете использовать значения бит-маски в любой комбинации, но если вы введете хотя бы одно значение не-бит-маски, результаты будут такими, чего вы не ожидаете. В вашем конкретном случае Merlin дал точный результат использования значения не-бит-маски с другими битовыми масками.

В двух словах, если вы используете UIControlStateNormal, установите вместе с ним tintColor. В противном случае используйте только значения в масках.

+1

спасибо за ваш подробный ответ, это действительно полезно. –

2

Просто установите titleColor для нормального состояния

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

button.tintColor = [UIColor redColor]; 
+0

спасибо, но почему я не могу установить красный цвет для всех состояний в одном выражении? –

+0

setTitleColor не оценивает ваше состояние или состояние, вот почему вы сталкиваетесь с проблемой –

+0

, но обычно свойства задаются таким образом –

0

Вы можете сделать это с раскадровки также.

button properties

От состояния атрибута конфигурации, вы можете выбрать любое состояние вы хотите и установить различные свойства соответственно.

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. Кнопка никогда не будет в этом состоянии, потому что она не определена. Таким образом, поведение также не определено.

+0

Вы указали в правильном направлении. Было бы намного лучше, если бы вы оставили подробное объяснение, так как многие люди не понимают, как работают битовые маски. :) – n00bProgrammer

+0

@Merlin, спасибо за ваш ответ, полезно :) –

+0

@Merlin, спасибо за ваш ответ, полезно :) –