Il colore del testo del pulsante UIActivityViewController e UIAlertController di iOS 8 utilizza la finestra tintColor




objective-c ios8 (4)

In iOS 8, sembra che i pulsanti su UIAlertController (in particolare il tipo di foglio di azioni) e i pulsanti su UIActivityViewController ottengano il loro colore dalla tintColor della finestra principale.

Come posso cambiare il colore del testo del pulsante? Ho provato a utilizzare il proxy di aspetto come questo:

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

Ma non ha alcun effetto. Il colore della finestra di TintColor è bianco, quindi il testo sui pulsanti UIActivityViewController è anch'esso bianco e non può essere visto. Cambiare tintColor della mia finestra risolve questo problema, ma rovina il resto dell'app.

Guarda lo screenshot del mio UIActivityViewController con un pulsante bianco di cancellazione con testo bianco in basso:

La stessa cosa vale per UIActionSheet (sì, lo so che è deprecato) e UIAlertController con il tipo actionSheet.

Come posso rendere leggibile il testo su queste finestre senza cambiare la tintaColor dell'intera app ?? Grazie in anticipo!


In iOS 9 sono riuscito a risolvere questo problema colorando la vista che presentava UIActivityViewController. Sfortunatamente, in iOS 10 / Xcode 8 questo ha smesso di funzionare per me. Stavo cercando di colorare un pannello Condivisione in modo che il pulsante Annulla non avesse un testo bianco e invisibile.

L'unica cosa che ho trovato che funziona in iOS 10 è UIButton.appearance().tintColor = UIColor.red . Puoi impostarlo globalmente nel delegato dell'app (ma questo tinge anche i pulsanti della barra di navigazione, ecc., Quindi devi andare a colorare manualmente un altro colore). Puoi anche impostarlo localmente in una vista, ma poiché si tratta di un tema globale che viene applicato a tutti i tipi di pulsanti, devi quindi reimpostarlo su un altro colore dopo se non vuoi che le prossime viste lo riprendano .

Così sono stato in grado di farlo funzionare come una tinta solo ai pulsanti ActivityController in modo 'hacker' aggiungendo la riga sopra con il mio colore di tinta dopo aver inizializzato l'UIActivityViewController ma prima che lo presentassi. E poi ho riportato la tinta al mio colore preferito (bianco) nel gestore di completamento della funzione di presentazione ActivityController.

ex: // immagine da condividere let image = UIImage (named: "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
        }
    })

LAVORATO PER ME: prima eseguire il backup della tinta corrente

//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
        }

    }

Questo ha funzionato per me con UIAlertController .

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

Soluzione elegante che utilizza con il gestore di completamento per 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
    }




tintcolor