web-dev-qa-db-fra.com

Changer la couleur du texte dans les boutons UIActionSheet

Dans mon projet, j'utilise UIActionSheet pour afficher certains types de tri. Je souhaite modifier la couleur du texte affiché dans les boutons de la feuille d'action. Comment pouvons-nous changer la couleur du texte?

33
kiri

iOS 8:UIActionSheet est déconseillé. UIAlertController respecte -[UIView tintColor], donc ça marche:

alertController.view.tintColor = [UIColor redColor];

Mieux encore, définissez la couleur de teinte de la fenêtre entière dans votre délégué d'application:

self.window.tintColor = [UIColor redColor];

iOS 7: Dans votre délégué de feuille d'action, implémentez -willPresentActionSheet: comme suit:

- (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];
        }
    }
}
73
jrc

Dans iOS 8, rien de tout cela ne fonctionne plus. Le texte de UIActionSheet semble tirer sa couleur de window.tintColor.

19
lifjoy

Cela fonctionne pour moi dans iOS8

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor redColor]];
17
blacksheep_2011

Si jamais vous souhaitez parcourir les sous-vues de UIActionSheet, vous ne devez pas définir directement la couleur du texte de UILabel mais utiliser le UIButtonsetTitleColor:forState méthode à la place. Sinon, la couleur initiale sera rétablie lors d'événements comme UIControlEventTouchDragOutside par exemple.

Voici la bonne façon de le faire, en réutilisant le code du jrc:

- (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];
        }
    }
}
12
Jonathan

Peut-être une réponse tardive, mais je pense que cela pourrait aider quelqu'un.

iOS 8: Vous pouvez simplement initialiser votre UIAlertAction avec le style: UIAlertActionStyleDestructive ainsi:

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

   // your code in here   

}];

Cela rendra le texte du bouton rouge par défaut.

enter image description here

5
Julius

Solution pour Swift. Change toutes les couleurs.

UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = .yellow
2
kubacizek

La solution @jrc fonctionne, mais la couleur de titleLabel change lorsque vous appuyez sur le bouton. Essayez ceci pour conserver la même couleur dans tous les états.

- (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];
        }
      }
}
2
seufagner

utiliser ceci pour ios 8 et supérieur

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.
}
1
Ravish

[~ # ~] modifier [~ # ~]

Voici une question similaire: Comment personnaliser les boutons dans UIActionSheet?

Essayez d'utiliser le protocole appearance [ NE FONCTIONNE PAS ]

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

UIAppearance peut gérer cela:

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

Beaucoup plus facile que de passer par les sous-vues, mais je n'ai pas testé cette solution sur iOS 6 ou une version antérieure.

0
cantoni