El color de text del button UIActivityViewController y UIAlertController de iOS 8 utiliza tintColor de la window

En iOS 8, parece que los botones en UIAlertController (específicamente el tipo de hoja de acción) y los botones en el UIActivityViewController obtienen su color del UIActivityViewController de la window principal.

¿Cómo puedo cambiar el color del text del button? He intentado usar el proxy de apariencia como este:

 [[UIButton appearanceWhenContainedIn:[UIActivityViewController class], nil] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 

Pero no tiene efecto. El tintocolor de mi window es blanco, por lo que el text en los botones UIActivityViewController también es blanco y no se puede ver. Cambiar el tintocolor de mi window resuelve este problema, pero ensucia el rest de la aplicación.

Vea la captura de pantalla de mi UIActivityViewController con un button de cancelación blanco con text blanco en la parte inferior:

UIActivityViewController con el texto del botón Cancelar blanco

Lo mismo aplica a UIActionSheet (sí, sé que está en desuso) y UIAlertController con el tipo actionSheet.

¿Cómo puedo hacer que el text en estas windows sea legible sin cambiar el color de tinte de toda la aplicación? ¡Gracias por adelantado!

Además del color de tinte global definido para su aplicación, cada controller de vista le permite anular el color de tinte solo para ese controller. En este caso, su mejor opción sería configurar el tintColor en su UIActivityViewController después de inicializarlo pero antes de presentarlo.

 UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities]; //Set the tint color on just the activity controller as needed here before presenting [activityController.view setTintColor:[UIColor blueColor]]; [self presentViewController:activityController animated:YES completion:nil]; 

Si haces esto mucho en tu aplicación, podrías usar una subclass o una categoría para evitar la duplicación de código.

Esto funcionó para mí con el UIAlertController .

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

En iOS 9, pude solucionar esto tinturando la vista que presentaba el UIActivityViewController. Desafortunadamente, en iOS 10 / Xcode 8 esto dejó de funcionar para mí. Estaba intentando aplicar tintes a un panel para compartir, de modo que el button cancelar no tuviera text blanco, invisible.

Lo único que encontré para funcionar en iOS 10 es UIButton.appearance().tintColor = UIColor.networking . Puede configurar esto globalmente en el delegado de la aplicación (pero esto también te da tintas en los botones de la barra de navigation, así que luego tiene que ir y colorearlos manualmente). También puede establecer esto localmente en una vista, pero como en realidad es un tema global que se aplica a todos los types de botones, debe volver a establecerlo en otro color después de si no desea que las próximas vistas lo recojan .

Por lo tanto, pude hacerlo funcionar como un tinte solo para los botones de My ActivityController de forma 'hackeada' añadiendo la línea de arriba con mi color de tinte después de inicializar el UIActivityViewController pero antes de presentarlo. Y luego puse el tinte en mi color preferido (blanco) en el manejador de finalización de la function de presentación ActivityController.

ej: // image para compartir, deje la image = UIImage (nombrado: "Imagen")

  // set up activity view controller let imageToShare = [ image! ] let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view UIButton.appearance().tintColor = UIColor.networking // present the view controller self.present(activityViewController, animated: true, completion: { DispatchQueue.main.async { UIButton.appearance().tintColor = UIColor.white } }) 

TRABAJADO PARA MÍ: tinte actual de copy de security primero

 //COLCSocialManager.showShareActivityViewController(fromVC: aViewController) class func showShareActivityViewController(fromVC vc: UIViewController){ //let textToShare = "TAXI RANKS LONDON. New iOS app for tourists and cabbies. Check it out its free. http://buff.ly/2kNMhyU" let textToShare = "TAXI RANKS LONDON. New iOS app for tourists and cabbies. Check it out its free." let linkToShare = "http://buff.ly/2kNMhyU" //on FB the link is converted let activityItems: [Any] = [ textToShare, linkToShare ] let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = vc.view // so that iPads won't crash // exclude some activity types from the list (optional) //activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ] let buttonTintBackup = UIButton.appearance().tintColor UIButton.appearance().tintColor = UIColor.networking // present the view controller vc.present(activityViewController, animated: true) { UIButton.appearance().tintColor = buttonTintBackup } }