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.
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
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.
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)
}
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)
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
pour iOS 10:
UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
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
}
}
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
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()
}
}
}