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?
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.
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]];
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.
Mise à jour pour Swift 4, Xcode 9
private static func setupAppearanceForAlertController() {
let view = UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self])
view.tintColor = .black
}
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
Changez simplement votre vue tintAdjustmentMode en UIViewTintAdjustmentModeNormal, afin que sa couleur ne change pas à la lumière.
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()
}
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)
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 UIAlertAction
s 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];
}];
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)
}
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.