web-dev-qa-db-fra.com

La couleur de teinte de UIAlertController est bleue par défaut en surbrillance

J'utilise le code suivant pour présenter une feuille d'actions UIAlertController avec le texte de l'article en rouge. J'ai utilisé la propriété teinte pour définir la couleur.

UIAlertController *alertController = [UIAlertController
                                      alertControllerWithTitle:nil
                                      message:nil
                                      preferredStyle:UIAlertControllerStyleActionSheet];
alertController.view.tintColor = [UIColor redColor];

La couleur du texte semble être bleu par défaut en surbrillance ou en sélection. Est-ce normal et comment puis-je arrêter cela?

31
Bcf Ant

Ceci est un bug connu, voir https://openradar.appspot.com/22209332

Pour résoudre ce problème, réappliquez la couleur de teinte dans le gestionnaire Completion. Voici ma solution rapide, vous pourrez l'adapter facilement pour ObjC:

alertController.view.tintColor = UIColor.redColor() // apply 1st time to prevent flicker from Blue to Red when displaying

navigationController?.presentViewController(alertController, animated: true, completion: {
    // Bugfix: iOS9 - Tint not fully Applied without Reapplying
    alertController.view.tintColor = UIColor.redColor()
})

One Note: Cela ne corrige pas le bogue entièrement. Lors de la rotation du périphérique, vous remarquerez que les boutons sont recolorés avec la teinte Système par défaut (= bleue).

Attendez-vous à ce qu'il soit corrigé avec iOS 9.1.

Éditer 23/10/2015: Toujours pas corrigé avec iOS 9.1. Nouvelle vérification avec iOS 9.1 + Xcode 7.1 (7B91B) publié il y a quelques jours. À partir de maintenant, le réglage de .tintColor ne fonctionne pas. Toutefois, comme indiqué, vous pouvez définir le paramètre tintColor de toute l'application, par exemple. dans AppDelegate didFinishLaunchingWithOptions, définissez window?.tintColor = UIColor.redColor(). Ceci teinte également les boutons AlertController mais peut ne pas convenir dans certains cas car cette teinte est appliquée dans toute l'application.

48

Ajoutez simplement la teinteColor après le presentViewController. Fonctionne sur iOS 9.0.2

[self presentViewController:alertController animated:YES completion:nil];

[alertController.view setTintColor:[UIColor yellowColor]];
38
Eddy

Vous pouvez également modifier la couleur de teinte de l'application dans appdelegate.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window.tintcolor = [UIColor yellowColor];
    return YES;
}

fonctionne parfaitement pour moi.

13
marco v berlo

Mise à jour pour Swift 4, Xcode 9

private static func setupAppearanceForAlertController() {
    let view = UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self])
    view.tintColor = .black
}
6
Ben M

Vous pouvez changer la couleur du bouton comme ceci

UIAlertAction* button = [UIAlertAction
                              actionWithTitle:@"Delete Profile"
                              style:UIAlertActionStyleDefault
                              handler:^(UIAlertAction * action)
                              {
                                  //Add Action.
                              }];
[button setValue:[UIColor redColor] forKey:@"titleTextColor"];

En utilisant cette ligne [button setValue: [UIColor redColor] forKey: @ "titleTextColor"]; Vous pouvez changer la couleur du bouton de votre feuille d'actions 

5
Kaushik Movaliya

Changez simplement votre vue tintAdjustmentMode en UIViewTintAdjustmentModeNormal, afin que sa couleur ne change pas à la lumière.

1
Alexander

Définissez la couleur de teinte dans traitCollectionDidChange dans une sous-classe de UIAlertController.

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    self.view.tintColor = UIColor.redColor()
}
1
laynemoseley

Définir les sous-classes personnalisées color et fontUIAlertController comme ceci 

import UIKit

class StyledAlertController: UIAlertController {

    private var cancelText:String?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.tintColor = YourColor
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        findLabel(view)
    }

    private func findLabel(scanView: UIView!) {
        if (scanView.subviews.count > 0) {
            for subview in scanView.subviews {
                if let label:UILabel = subview as? UILabel {
                    if (cancelText != nil && label.text == cancelText!) {
                        dispatch_async(dispatch_get_main_queue(),{
                            label.textColor = YourColor
                            label.tintColor = YourColor
                        })
                    }
                    let font:UIFont = UIFont(name: YourFont, size: label.font!.pointSize)!
                    label.font = font
                }
                findLabel(subview)
            }
        }
    }
}

Utilisez comme ceci (comme vous le feriez normalement)

let StyledAlertController = StyledAlertController(title: "My Title", message: "My Message", preferredStyle: .ActionSheet)

let cancelAction:UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
        print("Cancel Action Click")
    }
actionSheetController.addAction(cancelAction)

let anotherAction:UIAlertAction = UIAlertAction(title: "Another Action", style: .Default) { action -> Void in
        print("Another Action Click")
    }
actionSheetController.addAction(anotherAction:UIAlertAction)

presentViewController(actionSheetController, animated: true, completion: nil)
1
Michael

Je ne comprends toujours pas ce que vous voulez réaliser. Mais vous pouvez essayer la méthode de création de boutons Destructive proposée par Apple (la couleur du texte par défaut est le rouge). 

Le code dans lequel vous créez UIAlertActions n'utilise pas le style Default pour les boutons de votre choix en rouge. Utilisez plutôt UIAlertActionStyleDestructive. Exemple de code:

UIAlertAction* cancel = [UIAlertAction
                         actionWithTitle:@"Cancel"
                         style:UIAlertActionStyleDestructive
                         handler:^(UIAlertAction * action)
                         {
                             [view dismissViewControllerAnimated:YES completion:nil];

                         }];
0
Vinay Jain

Pour empêcher le "surgissement" rapide de la nouvelle couleur de teinte, la valeur alpha du contrôleur d'alerte peut être animée. Ensuite, cela ressemble exactement à s'il n'y avait pas de bogue:

    alertController.view.alpha = 0.0
    presentViewController(alertController, animated: false) {
        alertController.view.tintColor = UIColor.redColor()
        UIView.animateWithDuration(0.2, animations: { alertController.view.alpha = 1.0 }, completion: nil)
    }
0
Darko

UIAlertController est disponible sur iOS 8 et versions ultérieures. Il existe donc un bogue pour les appareils dotés d'une version antérieure. Il n'y a pas de problème pour les appareils avec la version correspondante ou supérieure.

0
G.Hakobyan