web-dev-qa-db-fra.com

UISearchBar annuler la couleur du bouton?

Lorsque je dépose une barre UISearchBar dans un affichage dans Interface Builder et que je change de style en Black Opaque, le bouton d'annulation reste bleu/gris et ne devient pas noir.

Comment puis-je rendre le bouton d'annulation noir?

EDIT: Cela fonctionne comme ceci:

// Assume a UISearchBar searchBar.
NSArray *subviews = [searchBar subviews];

// The index depends on how you configure the searchBar.
UIButton *cancelButton = [subviews objectAtIndex:3];

// Set the style to "normal" style.
[cancelButton setStyle:0];

Mais la méthode setStyle: provient d'un framework privé, ce qui peut poser un problème lors de la soumission de l'application à Apple.

35
cactus

J'ai utilisé quelque chose comme ça et travaillé avec moi:

[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]];

il a changé la couleur du bouton d'annulation en noir.

Update pour iOS 9.0, la méthode appearanceWhenContainedIn est obsolète, utilisez appearanceWhenContainedInInstancesOfClasses à la place:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor blackColor]];

Et dans Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black
108
Hossam Ghareeb

Le problème avec votre solution est que le code suppose que objectAtIndex: 3 est le bouton d'annulation. Cela génère non seulement un avertissement du compilateur, mais également si vous affichez le bouton Annuler par programmation (par exemple, en utilisant [searchBar setShowsCancelButton:YES], vous risquez de provoquer le blocage de l'application.

Une solution plus simple consiste à définir le style de la barre de recherche complète dans ViewDidLoad (), en utilisant:

searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];

cela remplace le style défini dans Interface Builder BUT mais change également la couleur du bouton Annuler pour qu'elle soit identique à celle de la barre entière (bien que cela ne vous permette malheureusement pas de définir le style du bouton Annuler de façon indépendante. 

30
Alun

Essayez ceci et voyez: (J'ai testé le code ci-dessous avec Swift 4.1 - Xcode 9.3-beta4 )

@IBOutlet weak var sbSearchBar: UISearchBar!

sbSearchBar.tintColor = UIColor.red
sbSearchBar.showsCancelButton = true
sbSearchBar.barTintColor = UIColor.blue
sbSearchBar.tintColor = UIColor.red

if let buttonItem = sbSearchBar.subviews.first?.subviews.last as? UIButton {
    buttonItem.setTitleColor(UIColor.yellow, for: .normal)
}

 enter image description here

4
Krunal

Ceci est une version mise à jour de La réponse de Hossam Ghareeb ci-dessus pour Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self] ).tintColor = UIColor.red

Mais ceci ne remplacera pas l'apparence s'il a déjà été défini ailleurs pour UIBarButtonItem.

Par exemple, dans mon contrôleur de barre de navigation, j'ai dû changer ceci:

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)

À cela pour que la solution ci-dessus fonctionne:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self] ).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)
4
Tim Semple

Dans Swift 4.2

let appearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(named: "goldColor")!], for: .normal)

Cela fonctionne pour moi. Merci @Tim Semple

2
black_pearl

Cliquez sur la barre de recherche et définissez la couleur tint sous la vue dans Interface Builder.

 enter image description here

1
Rishab

pour iOS 10:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
1
MobileMon

J'ai pris la réponse de Benjamin et je l'ai combinée avec une recherche sûre Array pour produire une version courte, mais sûre

searchController.searchBar.tintColor = UIColor.whiteColor()
(searchController.searchBar.subviews[safe: 0]?.subviews as? [UIView])?
    .filter({$0.isKindOfClass(UITextField)})
    .map({$0.tintColor = .lightGrayColor()})

Cela a pour effet de colorer le bouton Annuler en blanc et le curseur lors de la saisie en gris. Sinon, ce serait blanc et donc pas vu. searchController est un objet de type UISearchController. Si quelqu'un souhaite l'utiliser dans le contrôleur de résultats, remplacez-le par self.

L'implémentation de l'indice safe: est la réponse de nkukushkin:

extension Array {
    subscript(safe index: Int) -> T? {
        return indices(self) ~= index ? self[index] : nil
    }
}
1
Michal
let view: UIView = self.searchBar.subviews[0] as UIView
let subViewsArray = view.subviews

for subView: UIView in subViewsArray {
    if let cancelButt = subView as? UIButton{
        cancelButt.setTitleColor(UIColor.white, for: .normal)         
    }
}

Cela a fonctionné pour moi

1
Ghadeer

Pour ceux qui cherchent à reproduire le même comportement dans Swift: 

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()
        }
    }

}
0
Benjamin