web-dev-qa-db-fra.com

iOS 8 La couleur du texte des boutons UIActivityViewController et UIAlertController utilise la teinte de la fenêtre.

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:

UIActivityViewController with white Cancel button text

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!

30
DiscDev

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.

30
jlichti

Cela a fonctionné pour moi avec la UIAlertController.

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

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

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

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
    }
0
Prakash

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
        }

    }
0
brian.clear