Dans iOS 8, il semble que les boutons de UIAlertController
(en particulier le type de feuille d'action) ainsi que ceux de UIActivityViewController
obtiennent leur couleur de la teinte de la fenêtre principale.
Comment puis-je changer la couleur du texte du bouton? J'ai essayé d'utiliser le proxy d'apparence comme ceci:
[[UIButton appearanceWhenContainedIn:[UIActivityViewController class], nil] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
Mais cela n'a aucun effet. La teinte de ma fenêtre est blanche et le texte des boutons UIActivityViewController est également blanc et ne peut pas être vu. La modification de la teinte de ma fenêtre résout ce problème, mais cela gâche le reste de l'application.
Voir la capture d'écran de ma UIActivityViewController
avec un bouton d'annulation blanc avec du texte blanc en bas:
La même chose s'applique à UIActionSheet (oui, je sais que c'est obsolète) et à UIAlertController avec le type actionSheet.
Comment puis-je rendre le texte sur ces fenêtres lisible sans changer la teinteCouleur de l'application entière? Merci d'avance!
En plus de la couleur de teinte globale définie pour votre application, chaque contrôleur de vue vous permet de remplacer la couleur de teinte de ce contrôleur uniquement. Dans ce cas, votre meilleur choix serait de définir la teinte sur votre UIActivityViewController après l’initialisation mais avant la présentation.
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 vous faites cela souvent dans votre application, vous pouvez utiliser une sous-classe ou une catégorie pour éviter la duplication de code.
Cela a fonctionné pour moi avec la UIAlertController
.
[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blackColor]];
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
}
})
Dans iOS 9, j'ai pu résoudre ce problème en colorant la vue qui présentait UIActivityViewController. Malheureusement, dans iOS 10/Xcode 8, cela ne fonctionnait plus pour moi. J'essayais de teinter un panneau de partage afin que le bouton d'annulation ne contienne pas de texte blanc et invisible.
La seule chose que j'ai trouvée pour fonctionner dans iOS 10 est UIButton.appearance().tintColor = UIColor.red
. Vous pouvez définir cela globalement dans le délégué de l'application (mais cela teinte également les boutons de la barre de navigation, etc., de sorte que vous devez ensuite les colorer manuellement d'une autre couleur). Vous pouvez également définir cela localement dans une vue, mais comme il s'agit en fait d'un thème global qui s'applique à tous les types de bouton, vous devez le redéfinir sur une autre couleur si vous ne souhaitez pas que les vues suivantes le reprennent. .
Ainsi, je pouvais le faire fonctionner comme une teinte de mes boutons ActivityController de façon 'hackish en ajoutant la ligne ci-dessus avec ma couleur après avoir initialisé UIActivityViewController mais avant de le présenter. Et puis je redéfinis la teinte sur ma couleur préférée (blanc) dans le gestionnaire d'achèvement de la fonction de présentation ActivityController.
ex: // image à partager let image = UIImage (nommé: "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
}
})
Solution élégante utilisant avec le gestionnaire d'achèvement pour la UIActivityController
.
let barTintColor = UINavigationBar.appearance().barTintColor
let bTintColour = UINavigationBar.appearance().tintColor
UINavigationBar.appearance().barTintColor = UIColor.white
UINavigationBar.appearance().tintColor = UIColor.darkGray
activityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
UINavigationBar.appearance().barTintColor = barTintColor
UINavigationBar.appearance().tintColor = bTintColour
}
TRAVAILLE POUR MOI - sauvegarde la teinte actuelle en premier
//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
}
}