ios objective-c ios8 tintcolor

El color del texto del botón UIActivityViewController y UIAlertController de iOS 8 usa el color tintColor de la ventana



objective-c ios8 (5)

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

¿Cómo puedo cambiar el color del texto del botón? He intentado usar el proxy de apariencia como este:

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

Pero no tiene efecto. El tintColor de mi ventana es blanco, por lo que el texto en los botones UIActivityViewController también es blanco, y no se puede ver. Cambiar el tintColor de mi ventana resuelve este problema, pero desordena el resto de la aplicación.

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

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

¿Cómo puedo hacer que el texto de estas ventanas sea legible sin cambiar el tintColor de toda la aplicación? ¡Gracias por adelantado!


Además del color de tinte global definido para su aplicación, cada controlador de vista le permite anular el color de tinte solo para ese controlador. En este caso, lo mejor sería establecer tintColor en su UIActivityViewController después de inicializar pero antes de presentar.

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 está haciendo esto mucho en su aplicación, podría usar una subclase o una categoría para evitar la duplicación de código.


En iOS 9 pude arreglar esto al teñir la vista que presentaba el UIActivityViewController. Desafortunadamente, en iOS 10 / Xcode 8 esto dejó de funcionar para mí. Estaba tratando de teñir un panel de uso compartido para que el botón de cancelación no tuviera un texto blanco e invisible.

Lo único que encontré para trabajar en iOS 10 es UIButton.appearance().tintColor = UIColor.red . Puede configurarlo globalmente en el delegado de la aplicación (pero esto también tiñe los botones de la barra de navegación, etc., por lo que tendrá que pintarlos de otro color manualmente). También puede configurar esto localmente en una vista, pero debido a que en realidad es un tema global que se aplica a todos los tipos de botones, debe volver a establecerlo en otro color si no desea que las siguientes vistas lo capten. .

Por lo tanto, pude hacer que funcionara como un tinte solo en los botones de mi ActivityController de una manera "hackista" agregando la línea de arriba con el color de mi tinte después de haber inicializado el UIActivityViewController pero antes de presentarlo. Y luego establezco el tinte en mi color preferido (blanco) en el controlador de finalización de la función de presentación ActivityController.

ej .: // imagen para compartir let image = UIImage (llamada: "Image")

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


Esto me funcionó con el UIAlertController .

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


TRABAJÓ POR MÍ - copia de seguridad actual tinte primero

//COLCSocialManager.showShareActivityViewController(fromVC: aViewController) class func showShareActivityViewController(fromVC vc: UIViewController){ let textToShare = "TAXI. New iOS app for tourists and cabbies. Check it out its free." let linkToShare = "http://buff.ly/dddd" //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.red // present the view controller vc.present(activityViewController, animated: true) { UIButton.appearance().tintColor = buttonTintBackup } }


iOS 11

let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) activityVC.popoverPresentationController?.sourceView = self.view //Set your activity view controller''s appearance UIButton.appearance().tintColor = .blue //Set back to default UIButton appearance self.present(activityVC, animated: true, completion: { DispatchQueue.main.async { UIButton.appearance().tintColor = nil } })