UIAlertController fuente personalizada, tamaño, color

Estoy usando un nuevo UIAlertController para mostrar alertas. Tengo este código:

// nil titles break alert interface on iOS 8.0, so we'll be using empty strings UIAlertController *alert = [UIAlertController alertControllerWithTitle: title == nil ? @"": title message: message preferredStyle: UIAlertControllerStyleAlert]; UIAlertAction *defaultAction = [UIAlertAction actionWithTitle: cancelButtonTitle style: UIAlertActionStyleCancel handler: nil]; [alert addAction: defaultAction]; UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; [rootViewController presentViewController:alert animated:YES completion:nil]; 

Ahora quiero cambiar el título y la fuente del mensaje, el color, el tamaño y demás. ¿Cuál es la mejor manera de hacer esto?

Editar: debería insertar el código completo. Creé una categoría para UIView que podía mostrar la alerta correcta para la versión de iOS.

 @implementation UIView (AlertCompatibility) +( void )showSimpleAlertWithTitle:( NSString * )title message:( NSString * )message cancelButtonTitle:( NSString * )cancelButtonTitle { float iOSVersion = [[UIDevice currentDevice].systemVersion floatValue]; if (iOSVersion < 8.0f) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle: title message: message delegate: nil cancelButtonTitle: cancelButtonTitle otherButtonTitles: nil]; [alert show]; } else { // nil titles break alert interface on iOS 8.0, so we'll be using empty strings UIAlertController *alert = [UIAlertController alertControllerWithTitle: title == nil ? @"": title message: message preferredStyle: UIAlertControllerStyleAlert]; UIAlertAction *defaultAction = [UIAlertAction actionWithTitle: cancelButtonTitle style: UIAlertActionStyleCancel handler: nil]; [alert addAction: defaultAction]; UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; [rootViewController presentViewController:alert animated:YES completion:nil]; } } 

No estoy seguro de si esto va en contra de las API / propiedades privadas, pero usar KVC me funciona en ios8

 UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Dont care what goes here, since we're about to change below" message:@"" preferredStyle:UIAlertControllerStyleActionSheet]; NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"Presenting the great... Hulk Hogan!"]; [hogan addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:50.0] range:NSMakeRange(24, 11)]; [alertVC setValue:hogan forKey:@"attributedTitle"]; UIAlertAction *button = [UIAlertAction actionWithTitle:@"Label text" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ //add code to make something happen once tapped }]; UIImage *accessoryImage = [UIImage imageNamed:@"someImage"]; [button setValue:accessoryImage forKey:@"image"]; 

Para el registro, también es posible cambiar la fuente de la acción de alerta, usando esas API privadas. Nuevamente, puede hacer que rechacen su aplicación, aún no he intentado enviar dicho código.

 let alert = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) let action = UIAlertAction(title: "Some title", style: .Default, handler: nil) let attributedText = NSMutableAttributedString(string: "Some title") let range = NSRange(location: 0, length: attributedText.length) attributedText.addAttribute(NSKernAttributeName, value: 1.5, range: range) attributedText.addAttribute(NSFontAttributeName, value: UIFont(name: "ProximaNova-Semibold", size: 20.0)!, range: range) alert.addAction(action) presentViewController(alert, animated: true, completion: nil) // this has to be set after presenting the alert, otherwise the internal property __representer is nil guard let label = action.valueForKey("__representer")?.valueForKey("label") as? UILabel else { return } label.attributedText = attributedText 

Puede cambiar el color del botón aplicando un color de tinte a un UIAlertController.

En iOS 9, si el color del tinte de la ventana se estableció en un color personalizado, debe aplicar el color del tinte justo después de presentar la alerta. De lo contrario, el color del tinte se restablecerá al color del tinte de la ventana personalizada.

 // In your AppDelegate for example: window?.tintColor = UIColor.redColor() // Elsewhere in the App: let alertVC = UIAlertController(title: "Title", message: "message", preferredStyle: .Alert) alertVC.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) alertVC.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil)) // Works on iOS 8, but not on iOS 9 // On iOS 9 the button color will be red alertVC.view.tintColor = UIColor.greenColor() self.presentViewController(alert, animated: true, completion: nil) // Necessary to apply tint on iOS 9 alertVC.view.tintColor = UIColor.greenColor() 

Puedes cambiar el color del texto del botón usando este código:

 alertC.view.tintColor = your color; 

Quizás esto te ayude.

Una traducción Swift de la respuesta @ dupuis2387. UIAlertController la syntax para establecer el color y la fuente del título UIAlertController través de KVC utilizando la clave attributedTitle .

 let message = "Some message goes here." let alertController = UIAlertController( title: "", // This gets overridden below. message: message, preferredStyle: .Alert ) let okAction = UIAlertAction(title: "OK", style: .Cancel) { _ -> Void in } alertController.addAction(okAction) let fontAwesomeHeart = "\u{f004}" let fontAwesomeFont = UIFont(name: "FontAwesome", size: 17)! let customTitle:NSString = "I \(fontAwesomeHeart) Swift" // Use NSString, which lets you call rangeOfString() let systemBoldAttributes:[String : AnyObject] = [ // setting the attributed title wipes out the default bold font, // so we need to reconstruct it. NSFontAttributeName : UIFont.boldSystemFontOfSize(17) ] let attributedString = NSMutableAttributedString(string: customTitle as String, attributes:systemBoldAttributes) let fontAwesomeAttributes = [ NSFontAttributeName: fontAwesomeFont, NSForegroundColorAttributeName : UIColor.redColor() ] let matchRange = customTitle.rangeOfString(fontAwesomeHeart) attributedString.addAttributes(fontAwesomeAttributes, range: matchRange) alertController.setValue(attributedString, forKey: "attributedTitle") self.presentViewController(alertController, animated: true, completion: nil) 

enter image description here

En Xcode 8 Swift 3.0

 @IBAction func touchUpInside(_ sender: UIButton) { let alertController = UIAlertController(title: "", message: "", preferredStyle: .alert) //to change font of title and message. let titleFont = [NSFontAttributeName: UIFont(name: "ArialHebrew-Bold", size: 18.0)!] let messageFont = [NSFontAttributeName: UIFont(name: "Avenir-Roman", size: 12.0)!] let titleAttrString = NSMutableAttributedString(string: "Title Here", attributes: titleFont) let messageAttrString = NSMutableAttributedString(string: "Message Here", attributes: messageFont) alertController.setValue(titleAttrString, forKey: "attributedTitle") alertController.setValue(messageAttrString, forKey: "attributedMessage") let action1 = UIAlertAction(title: "Action 1", style: .default) { (action) in print("\(action.title)") } let action2 = UIAlertAction(title: "Action 2", style: .default) { (action) in print("\(action.title)") } let action3 = UIAlertAction(title: "Action 3", style: .default) { (action) in print("\(action.title)") } let okAction = UIAlertAction(title: "Ok", style: .default) { (action) in print("\(action.title)") } alertController.addAction(action1) alertController.addAction(action2) alertController.addAction(action3) alertController.addAction(okAction) alertController.view.tintColor = UIColor.blue alertController.view.backgroundColor = UIColor.black alertController.view.layer.cornerRadius = 40 present(alertController, animated: true, completion: nil) } 

Salida

Fuente, tamaño y color personalizados UIAlertController

Use el protocolo UIAppearance . Ejemplo para configurar una fuente: crea una categoría para extender UILabel :

 @interface UILabel (FontAppearance) @property (nonatomic, copy) UIFont * appearanceFont UI_APPEARANCE_SELECTOR; @end @implementation UILabel (FontAppearance) -(void)setAppearanceFont:(UIFont *)font { if (font) [self setFont:font]; } -(UIFont *)appearanceFont { return self.font; } @end 

Y su uso:

 UILabel * appearanceLabel = [UILabel appearanceWhenContainedIn:UIAlertController.class, nil]; [appearanceLabel setAppearanceFont:[UIFont boldSystemFontOfSize:10]]; //for example 

Probado y trabajando con el estilo UIAlertControllerStyleActionSheet , pero creo que también funcionará con UIAlertControllerStyleAlert .

PD: compruebe mejor la disponibilidad de clase en lugar de la versión de iOS:

 if ([UIAlertController class]) { // UIAlertController code (iOS 8) } else { // UIAlertView code (pre iOS 8) } 

Use el protocolo UIAppearance . Haz más hacks con appearanceFont para cambiar la fuente para UIAlertAction .

Crea una categoría para UILabel

UILabel + FontAppearance.h

 @interface UILabel (FontAppearance) @property (nonatomic, copy) UIFont * appearanceFont UI_APPEARANCE_SELECTOR; @end 

UILabel + FontAppearance.m

 @implementation UILabel (FontAppearance) - (void)setAppearanceFont:(UIFont *)font { if (self.tag == 1001) { return; } BOOL isBold = (self.font.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold); const CGFloat* colors = CGColorGetComponents(self.textColor.CGColor); if (self.font.pointSize == 14) { // set font for UIAlertController title self.font = [UIFont systemFontOfSize:11]; } else if (self.font.pointSize == 13) { // set font for UIAlertController message self.font = [UIFont systemFontOfSize:11]; } else if (isBold) { // set font for UIAlertAction with UIAlertActionStyleCancel self.font = [UIFont systemFontOfSize:12]; } else if ((*colors) == 1) { // set font for UIAlertAction with UIAlertActionStyleDestructive self.font = [UIFont systemFontOfSize:13]; } else { // set font for UIAlertAction with UIAlertActionStyleDefault self.font = [UIFont systemFontOfSize:14]; } self.tag = 1001; } - (UIFont *)appearanceFont { return self.font; } @end 

Uso:

añadir

[[UILabel appearanceWhenContainedIn:UIAlertController.class, nil] setAppearanceFont:nil];

en AppDelegate.m para que funcione para todo UIAlertController .

Lo estoy usando.

 [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]]; 

Agregue una línea (AppDelegate) y funcione para todo UIAlertController.

Swift 4

Ejemplo de fuente personalizada en el título. Lo mismo para otros componentes como mensajes o acciones.

  let titleAttributed = NSMutableAttributedString( string: Constant.Strings.cancelAbsence, attributes: [NSAttributedStringKey.font:UIFont(name:"FONT_NAME",size: FONT_SIZE)] ) let alertController = UIAlertController( title: "", message: "", preferredStyle: UIAlertControllerStyle.YOUR_STYLE ) alertController.setValue(titleAttributed, forKey : "attributedTitle") present(alertController, animated: true, completion: nil) 

Hay un problema al establecer el color del tinte en la vista después de la presentación; incluso si lo hace en el bloque de finalización de presentViewController: animated: completion :, produce un efecto de parpadeo en el color de los títulos de los botones. Esto es descuidado, poco profesional y completamente inaceptable.

Otras soluciones presentadas dependen de que la jerarquía de vistas permanezca estática, algo que Apple detesta hacer. Espere que esas soluciones fallen en versiones futuras de iOS.

La única forma segura de resolver este problema y hacerlo en todas partes, es mediante la adición de una categoría a UIAlertController y el swizzling de la vista WillAppear.

El encabezado:

 // // UIAlertController+iOS9TintFix.h // // Created by Flor, Daniel J on 11/2/15. // #import  @interface UIAlertController (iOS9TintFix) + (void)tintFix; - (void)swizzledViewWillAppear:(BOOL)animated; @end 

La implementación:

 // // UIAlertController+iOS9TintFix.m // // Created by Flor, Daniel J on 11/2/15. // #import "UIAlertController+iOS9TintFix.h" #import  @implementation UIAlertController (iOS9TintFix) + (void)tintFix { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method method = class_getInstanceMethod(self, @selector(viewWillAppear:)); Method swizzle = class_getInstanceMethod(self, @selector(swizzledViewWillAppear:)); method_exchangeImplementations(method, swizzle);}); } - (void)swizzledViewWillAppear:(BOOL)animated { [self swizzledViewWillAppear:animated]; for (UIView *view in self.view.subviews) { if (view.tintColor == self.view.tintColor) { //only do those that match the main view, so we don't strip the red-tint from destructive buttons. self.view.tintColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0]; [view setNeedsDisplay]; } } } @end 

Agregue un .pch (encabezado precomstackdo) a su proyecto e incluya la categoría:

 #import "UIAlertController+iOS9TintFix.h" 

Asegúrese de registrar su pch en el proyecto correctamente, e incluirá los métodos de categoría en cada clase que use el UIAlertController.

Luego, en su aplicación, los delegates hicieron el método FinishLaunchingWithOptions, importan su categoría y llaman

 [UIAlertController tintFix]; 

y se propagará automáticamente a cada instancia de UIAlertController dentro de su aplicación, ya sea que lo haya iniciado su código o el de cualquier otra persona.

Esta solución funciona tanto para iOS 8.X como para iOS 9.X y carece del parpadeo del enfoque de post-presentación de cambio de matiz. También es completamente agnóstico con respecto a la jerarquía de vista de las sub-vistas del UIAlertController.

¡Feliz hacking!

Acabo de completar un reemplazo para UIAlertController . Esta es la única manera sensata de hacerlo, creo:


Antiguo

Aquí está mi método en Swift que procesa gran cantidad de información de las respuestas aquí

 func changeAlert(alert: UIAlertController, backgroundColor: UIColor, textColor: UIColor, buttonColor: UIColor?) { let view = alert.view.firstSubview().firstSubview() view.backgroundColor = backgroundColor view.layer.cornerRadius = 10.0 // set color to UILabel font setSubviewLabelsToTextColor(textColor, view: view) // set font to alert via KVC, otherwise it'll get overwritten let titleAttributed = NSMutableAttributedString( string: alert.title!, attributes: [NSFontAttributeName:UIFont.boldSystemFontOfSize(17)]) alert.setValue(titleAttributed, forKey: "attributedTitle") let messageAttributed = NSMutableAttributedString( string: alert.message!, attributes: [NSFontAttributeName:UIFont.systemFontOfSize(13)]) alert.setValue(messageAttributed, forKey: "attributedMessage") // set the buttons to non-blue, if we have buttons if let buttonColor = buttonColor { alert.view.tintColor = buttonColor } } func setSubviewLabelsToTextColor(textColor: UIColor, view:UIView) { for subview in view.subviews { if let label = subview as? UILabel { label.textColor = textColor } else { setSubviewLabelsToTextColor(textColor, view: subview) } } } 

Esto funciona en algunas situaciones perfectamente, y en otros es un fracaso total (los colores del tinte no se muestran como se esperaba).

Solución / Hack para iOS9

  UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Test Error" message:@"This is a test" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { NSLog(@"Alert View Displayed"); [[[[UIApplication sharedApplication] delegate] window] setTintColor:[UIColor whiteColor]]; }]; [alertController addAction:cancelAction]; [[[[UIApplication sharedApplication] delegate] window] setTintColor:[UIColor blackColor]]; [self presentViewController:alertController animated:YES completion:^{ NSLog(@"View Controller Displayed"); }]; 

Puede usar una biblioteca externa como PMAlertController sin usar una solución, donde puede sustituir el UIAlertController incalculable de Apple con una alerta súper personalizable.

Compatible con Xcode 8, Swift 3 y Objective-C

Ejemplo de PMAlertController

caracteristicas:

  • [x] Vista de encabezado
  • [x] Imagen de encabezado (opcional)
  • [x] Título
  • [x] Mensaje de descripción
  • [x] Personalizaciones: fonts, colores, dimensiones y más
  • [x] 1, 2 botones (horizontalmente) o 3+ botones (verticalmente)
  • [x] Cierre cuando se presiona un botón
  • [x] Soporte de campos de texto
  • [x] Implementación similar a UIAlertController
  • [x] Cocoapods
  • [x] Cartago
  • [x] Animación con UIKit Dynamics
  • [x] Compatibilidad con Objective-C
  • [x] Soporte de Swift 2.3 y Swift 3

Yo trabajo para Urban Outfitters. Tenemos un pod de código abierto, URBNAlert , que utilizamos en todas nuestras aplicaciones. Está basado en UIAlertController , pero es altamente personalizable.

La fuente está aquí: https://github.com/urbn/URBNAlert

O simplemente instálelo colocando URBNAlert en su Podfile

Aquí hay un código de muestra:

 URBNAlertViewController *uac = [[URBNAlertViewController alloc] initWithTitle:@"The Title of my message can be up to 2 lines long. It wraps and centers." message:@"And the message that is a bunch of text. And the message that is a bunch of text. And the message that is a bunch of text."]; // You can customize style elements per alert as well. These will override the global style just for this alert. uac.alertStyler.blurTintColor = [[UIColor orangeColor] colorWithAlphaComponent:0.4]; uac.alertStyler.backgroundColor = [UIColor orangeColor]; uac.alertStyler.textFieldEdgeInsets = UIEdgeInsetsMake(0.0, 15.0, 0.0, 15.0); uac.alertStyler.titleColor = [UIColor purpleColor]; uac.alertStyler.titleFont = [UIFont fontWithName:@"Chalkduster" size:30]; uac.alertStyler.messageColor = [UIColor blackColor]; uac.alertStyler.alertMinWidth = @150; uac.alertStyler.alertMaxWidth = @200; // many more styling options available [uac addAction:[URBNAlertAction actionWithTitle:@"Ok" actionType:URBNAlertActionTypeNormal actionCompleted:^(URBNAlertAction *action) { // Do something }]]; [uac addAction:[URBNAlertAction actionWithTitle:@"Cancel" actionType:URBNAlertActionTypeCancel actionCompleted:^(URBNAlertAction *action) { // Do something }]]; [uac show]; 

Por favor encuentra esta categoría Puedo cambiar FONT y Color de UIAlertAction y UIAlertController.

Utilizar:

 UILabel * appearanceLabel = [UILabel appearanceWhenContainedIn:UIAlertController.class, nil]; [appearanceLabel setAppearanceFont:yourDesireFont]]; 

Un poco torpe, pero esto me funciona ahora mismo para establecer colores de fondo y texto. Lo encontré aquí .

 UIView * firstView = alertController.view.subviews.firstObject; UIView * nextView = firstView.subviews.firstObject; nextView.backgroundColor = [UIColor blackColor]; 

Para cambiar el color de un botón como CANCELAR al color rojo, puede usar esta propiedad de estilo llamada UIAlertActionStyle.destructive:

 let prompt = UIAlertController.init(title: "Reset Password", message: "Enter Your E-mail :", preferredStyle: .alert) let okAction = UIAlertAction.init(title: "Submit", style: .default) { (action) in //your code } let cancelAction = UIAlertAction.init(title: "Cancel", style: UIAlertActionStyle.destructive) { (action) in //your code } prompt.addTextField(configurationHandler: nil) prompt.addAction(okAction) prompt.addAction(cancelAction) present(prompt, animated: true, completion: nil); 

Creé un método objective-C

 -(void)customAlertTitle:(NSString*)title message:(NSString*)message{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil]; UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 80)]; UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 270, 50)]; titleLabel.text = title; titleLabel.font = [UIFont boldSystemFontOfSize:20]; titleLabel.numberOfLines = 2; titleLabel.textColor = [UIColor redColor]; titleLabel.textAlignment = NSTextAlignmentCenter; [subView addSubview:titleLabel]; UILabel *messageLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 30, 270, 50)]; messageLabel.text = message; messageLabel.font = [UIFont systemFontOfSize:18]; messageLabel.numberOfLines = 2; messageLabel.textColor = [UIColor redColor]; messageLabel.textAlignment = NSTextAlignmentCenter; [subView addSubview:messageLabel]; [alertView setValue:subView forKey:@"accessoryView"]; [alertView show]; } 

Código que funciona perfectamente en Xcode 8.3.1. Puede personalizar según los requisitos.

Solo uso este tipo de demanda, al parecer y el sistema, los detalles son ligeramente diferentes, por lo que estamos … OC se dio cuenta de la ventana emergente Alert y Sheet.

A menudo se encuentran en el desarrollo diario necesidad de agregar una figura a Alerta o cambiar el color de un botón, como la demanda “simple”, hoy trae un componente del sistema y muy similar y puede satisfacer plenamente la demanda de componentes de embalaje personalizados.

Github: https://github.com/ReverseScale/RSCustomAlertView

Para iOS 9.0 y superior, use este código en el delegado de la aplicación

 [[UIView appearanceWhenContainedInInstancesOfClasses:@[[UIAlertController class]]] setTintColor:[UIColor redColor]]; 

En Swift 4.1 y Xcode 9.4.1

 //Displaying alert with multiple actions and custom font ans size let alert = UIAlertController(title: "", message: "", preferredStyle: .alert) let titFont = [NSAttributedStringKey.font: UIFont(name: "ArialHebrew-Bold", size: 15.0)!] let msgFont = [NSAttributedStringKey.font: UIFont(name: "Avenir-Roman", size: 13.0)!] let titAttrString = NSMutableAttributedString(string: "Title Here", attributes: titFont) let msgAttrString = NSMutableAttributedString(string: "Message Here", attributes: msgFont) alert.setValue(titAttrString, forKey: "attributedTitle") alert.setValue(msgAttrString, forKey: "attributedMessage") let action1 = UIAlertAction(title: "Action 1", style: .default) { (action) in print("\(String(describing: action.title))") } let action2 = UIAlertAction(title: "Action 2", style: .default) { (action) in print("\(String(describing: action.title))") } let okAction = UIAlertAction(title: "Ok", style: .default) { (action) in print("\(String(describing: action.title))") } alert.addAction(action1) alert.addAction(action2) alert.addAction(okAction) alert.view.tintColor = UIColor.blue alert.view.layer.cornerRadius = 40 // //If required background colour // alert.view.backgroundColor = UIColor.white DispatchQueue.main.async(execute: { self.present(alertController, animated: true) })