web-dev-qa-db-fra.com

Changer la couleur du curseur sur UISearchBar sans changer tintColor

Je veux que la couleur de teinte de ma barre de recherche soit blanche (ce qui signifie que le bouton d'annulation soit blanc). Le curseur n'est pas visible lorsque la couleur de la teinte est blanche. Existe-t-il un moyen de définir la couleur du curseur séparément?

39
Ashish Awaghad

Définissez votre couleur de teinte à la couleur que vous souhaitez que le bouton d'annulation soit, puis utilisez le IAppearance Protocol pour changer la couleur de teinte dans le champ de texte pour qu'elle soit la couleur que vous souhaitez que le curseur soit. Ex:

[self.searchBar setTintColor:[UIColor whiteColor]];                
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor darkGrayColor]];
64
McFadden

Si vous aimez les doublures fonctionnelles, mais ennuyeuses dans Swift, j'ai obtenu la boucle de Benjamin pour ceci:

searchController.searchBar.tintColor = UIColor.whiteColor()

searchController.searchBar.subviews[0].subviews.flatMap(){ $0 as? UITextField }.first?.tintColor = UIColor.blueColor()
13
iantheparker

Version Swift 3.0 et 4

searchController.searchBar.tintColor = .white        
UITextField.appearance(whenContainedInInstancesOf: [type(of: searchController.searchBar)]).tintColor = .black

Notez que searchBar ne peut pas être facultatif.

9
Fangming

Compact Swift 2.0 utilisant la syntaxe for-where (pas besoin de rompre la boucle):

// Make SearchBar's tint color white to get white cancel button.
searchBar.tintColor = UIColor.white()

// Loop into it's subviews and find TextField, change tint color to something else.
for subView in searchBar.subviews[0].subviews where subView.isKindOfClass(UITextField) {
        subView.tintColor = UIColor.darkTextColor()
}
6
Felipe Nuila
searchBar.tintColor = [UIColor whiteColor];
searchBar.backgroundColor = [UIColor clearColor];
for ( UIView *v in [searchBar.subviews.firstObject subviews] )
{
    if ( YES == [v isKindOfClass:[UITextField class]] )
    {
        [((UITextField*)v) setTintColor:[UIColor blueColor]];
        break;
    }
}

enter image description here

5
Roman Solodyashkin

Cela a semblé fonctionner pour moi dans Swift également.

    searchController.searchBar.tintColor = UIColor.whiteColor()
    UITextField.appearanceWhenContainedInInstancesOfClasses([searchController.searchBar.dynamicType]).tintColor = UIColor.blackColor()
5
Eric Hodgins

Pour ceux qui cherchent à faire de même dans Swift, voici une solution que je suis arrivée après beaucoup de problèmes:

override func viewWillAppear(animated: Bool) {
    self.searchBar.tintColor = UIColor.whiteColor()

    let view: UIView = self.searchBar.subviews[0] as! UIView
    let subViewsArray = view.subviews

    for (subView: UIView) in subViewsArray as! [UIView] {
        println(subView)
        if subView.isKindOfClass(UITextField){
            subView.tintColor = UIColor.blueColor()
        }
    }

}
4
Benjamin

iOS 9 et supérieur

La façon la plus simple de définir une teinte différente pour le bouton Annuler et le champ de texte, utilisez ceci:

[self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:UIColor.blueColor];
3
Adam Studenic

Je voudrais simplement ajouter une extension à UISearchBar avec le code suivant.

extension UISearchBar {
    var cursorColor: UIColor! {
        set {
            for subView in self.subviews[0].subviews where ((subView as? UITextField) != nil) {
                subView.tintColor = newValue
            }
        }
        get {
            for subView in self.subviews[0].subviews where ((subView as? UITextField) != nil) {
                return subView.tintColor
            }
            // Return default tintColor
            return UIColor.eightBit(red: 1, green: 122, blue: 255, alpha: 100)
        }
    }
}
3
I make my mark

C'est la solution la plus simple.

let textField = self.searchBar.value(forKey: "searchField") as! UITextField

    textField.tintColor = UIColor.white
1
Teodor Pavlov

Le plus simple en Swift 5:

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = .black
0
Joshua Hart

Voici une version "fonctionnelle" de la réponse de Felipe (Swift 4.2)

// Make SearchBar's tint color white to get white cancel button.
searchBar.tintColor = .white

// Get the TextField subviews, change tint color to something else.
if let textFields = searchBar.subviews.first?.subviews.compactMap({ $0 as? UITextField }) {
        textFields.forEach { $0.tintColor = UIColor.darkGray }
}
0
Frédéric Adda