2013-04-23 3 views

ответ

66

IOS 8:UIActionSheet осуждается. UIAlertController уважает -[UIView tintColor], так это работает:

alertController.view.tintColor = [UIColor redColor]; 

еще лучше, установить оттенок цвета всего окна в вашем приложении делегат:

self.window.tintColor = [UIColor redColor]; 

прошивкой 7: в своем действии лист делегата реализации -willPresentActionSheet: в следует:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet 
{ 
    for (UIView *subview in actionSheet.subviews) { 
     if ([subview isKindOfClass:[UIButton class]]) { 
      UIButton *button = (UIButton *)subview; 
      [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 
     } 
    } 
} 
+3

Это работает только по умолчанию. Если вы нажмете кнопку, она будет синим цветом на titleLabel. – seufagner

+3

Спасибо. Попробуйте вместо [button setTitleColor: fooColor forState: UIControlStateNormal]. – jrc

+0

Это просто не работает на симуляторе iPhone. –

1

EDIT

Вот аналогичный вопрос: How to customize Buttons in UIActionSheet?

Попробуйте использовать протокол appearance [НЕ РАБОТАЮ]

UIButton *btn = [UIButton appearanceWhenContainedIn:[UIActionSheet class], nil]; 
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 
12

Если вы хотите пройти через UIActionSheet, вы не должны прямо устанавливать цвет текста UILabel, но вместо этого используйте метод setTitleColor:forState. В противном случае начальный цвет будет установлен на такие события, как UIControlEventTouchDragOutside, например.

Вот правильный способ сделать это, повторное использование кода в СИЦ:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet 
{ 
    for (UIView *subview in actionSheet.subviews) { 
     if ([subview isKindOfClass:[UIButton class]]) { 
      UIButton *button = (UIButton *)subview; 
      [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 
     } 
    } 
} 
+1

Хороший звонок, Джонатан. – jrc

2

решение @jrc работает, но изменения цвета titleLabel при нажатии на кнопку. Попробуйте, чтобы он сохранял один и тот же цвет во всех состояниях.

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet 
{  
UIColor *customTitleColor = [UIColor greenColor]; 
     for (UIView *subview in actionSheet.subviews) { 
     if ([subview isKindOfClass:[UIButton class]]) { 
      UIButton *button = (UIButton *)subview; 

      [button setTitleColor:customTitleColor forState:UIControlStateHighlighted]; 
      [button setTitleColor:customTitleColor forState:UIControlStateNormal]; 
      [button setTitleColor:customTitleColor forState:UIControlStateSelected]; 
     } 
     } 
} 
0

UIAppearance может справиться с этим:

[[UIButton appearanceWhenContainedIn:[UIActionSheet class], nil] setTitleColor:[UIColor cyanColor] forState:UIControlStateNormal]; 

Намного проще, чем идти через подвидов, но я не проверял это решение на IOS 6 или более ранних версий.

+2

Жаль. не работает на iOS 7 и выше. –

19

В iOS 8 все это не работает. Текст UIActionSheet, кажется, получает свой цвет из window.tintColor.

+0

вы нашли обходное решение? –

+0

Извините за поздний ответ. Мое обходное решение состояло в том, чтобы остановить изменение window.tintColor или self.view.tintColor на белый. Вместо этого я теперь явно устанавливаю любые элементы, которым нужен белый tintColor, вместо того, чтобы полагаться на родительский вид tintColors. – lifjoy

+0

Nice post! так как все время задавались вопросом, почему мои 'UIAlertViews' и' UIAlertController' появляются в 'whiteColor'. –

15

Это работает для меня в iOS8 использование

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor redColor]]; 
+4

Это изменит цвет всех кнопок, включая кнопку отмены. Есть ли способ изменить цвет на красный, но не на кнопку отмены? – etayluz

1

это для ИОС 8 и выше

SEL selector = NSSelectorFromString(@"_alertController"); 
if ([actionSheet respondsToSelector:selector]) 
{ 
    UIAlertController *alertController = [actionSheet valueForKey:@"_alertController"]; 
    if ([alertController isKindOfClass:[UIAlertController class]]) 
    { 
     alertController.view.tintColor = [UIColor blueColor]; 
    } 
} 
else 
{ 
    // use other methods for iOS 7 or older. 
} 
4

Может быть поздний ответ, но я полагаю, что это может помочь кому-то.

IOS 8: Вы могли бы просто инициализировать UIAlertAction со стилем: UIAlertActionStyleDestructive так:

UIAlertAction *delete = [UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action){ 

    // your code in here 

}]; 

Это сделает баттона текст красным по умолчанию.

enter image description here

0

Soulution для Swift 3. Изменяет все цвета.

UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = .yellow 
Смежные вопросы