ios objective-c ios9 uialertcontroller

ios - El color del tinte UIAlertController se establece de manera predeterminada en azul al resaltar



objective-c ios9 (11)

Utilizo el siguiente código para presentar una hoja de acción UIAlertController con el texto del elemento en rojo. He usado la propiedad tinte para establecer el color.

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

El color del texto parece ser predeterminado en azul en el resaltado o selección. ¿Es esto normal y cómo paro esto?


Establezca el color de tinte en traitCollectionDidChange en una subclase de UIAlertController .

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


Este es un error conocido, consulte https://openradar.appspot.com/22209332

Para solucionarlo, vuelva a aplicar el color de tinte en el controlador de finalización. Aquí está mi solución Swift, podrás adaptarla fácilmente para 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() })

Una nota: esto no soluciona el error por completo. Notará en la rotación del dispositivo que los botones se vuelven a almacenar con el color predeterminado del sistema (= azul).

Espera que sea arreglado con iOS 9.1.

Editar 10/23/2015: Todavía no se solucionó con iOS 9.1. Vuelto a probar con iOS 9.1 + Xcode 7.1 (7B91B) lanzado hace un par de días. A partir de ahora, la configuración del .tintColor no funciona, sin embargo, como se comentó, puede configurar el tintColor de toda la aplicación, por ejemplo, en la window?.tintColor = UIColor.redColor() configuración AppDelegate didFinishLaunchingWithOptions window?.tintColor = UIColor.redColor() . Esto también tiñe los botones de AlertController, pero puede que no sea adecuado en algunos casos, ya que este tinte se aplica en toda la aplicación.


Para configurar el color personalizado y la subclase de fuente UIAlertController esta manera.

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) } } } }

Utilice de esta manera (como lo haría normalmente)

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)


Para evitar la rápida "aparición" del nuevo color del tinte, se puede animar el valor alfa del controlador de alerta. Entonces se ve exactamente igual que si no hubiera ningún error:

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) }


Puedes cambiar el color del botón como este

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

Usando esta línea [button setValue: [UIColor redColor] forKey: @ "titleTextColor"]; Puedes cambiar el color del botón de tu hoja de acción.


Simplemente agregue el tintColor después del presente ViewController. Funciona en iOS 9.0.2

[self presentViewController:alertController animated:YES completion:nil]; [alertController.view setTintColor:[UIColor yellowColor]];


Simplemente cambie su vista tintAdjustmentMode a UIViewTintAdjustmentModeNormal, para que no cambie su color en dimm.


También puede cambiar el color del tinte de la aplicación en appdelegate.

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

funciona perfecto para mi


Todavía estoy confundido con lo que quieres lograr. Pero puede probar la forma en que Apple crea los botones Destructive (el color predeterminado del texto es rojo).

El código donde está creando UIAlertAction s no usa el estilo Default para los botones que desea en color rojo. En su lugar, utilice UIAlertActionStyleDestructive . Código de muestra :

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


UIAlertController está disponible para iOS 8 y versiones posteriores, por lo que existe un error para los dispositivos con una versión anterior. No hay problema para los dispositivos con la versión correspondiente o superior.


Actualización para Swift 4, Xcode 9

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