Changer la couleur du curseur sur UiseearchBar sans changer de teint
-
20-12-2019 - |
Question
Je veux que ma couleur de teinte de la barre de recherche soit blanche (ce qui signifie que le bouton Annuler soit blanc).Le curseur n'est pas visible lorsque la couleur de la teinte est blanche.Y a-t-il un moyen de définir la couleur du curseur séparément?
La solution
Définissez votre couleur de teinte sur la couleur que vous souhaitez que le bouton Annuler soit puis utilisez le protocole UIAPPearance Pour changer la couleur de la teinte sur le champ de texte pour être la couleur que vous souhaitez que le curseur soit.Ex:
[self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor darkGrayColor]];
Autres conseils
Si vous aimez des doublures fonctionnelles, encore gênantes à Swift, j'ai eu une boucle de Benjamin à ce sujet:
searchController.searchBar.tintColor = UIColor.whiteColor()
searchController.searchBar.subviews[0].subviews.flatMap(){ $0 as? UITextField }.first?.tintColor = UIColor.blueColor()
Version SWIFT 3.0 et 4
searchController.searchBar.tintColor = .white
UITextField.appearance(whenContainedInInstancesOf: [type(of: searchController.searchBar)]).tintColor = .black
Notez que la barre de recherche ne peut pas être facultative.
solution compacte Swift 2.0 en utilisant pour-où syntaxe (pas besoin de casser 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()
}
Cela semblait travailler pour moi à Swift aussi.
searchController.searchBar.tintColor = UIColor.whiteColor()
UITextField.appearanceWhenContainedInInstancesOfClasses([searchController.searchBar.dynamicType]).tintColor = UIColor.blackColor()
Pour ceux qui cherchent à faire la même chose à Swift, voici une solution que je suis venue chez ACCROS 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()
}
}
}
J'ajouterais simplement une extension à UiseearchBar 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)
}
}
}
iOS 9 et plus
Le moyen le plus simple de définir un TintColor différent pour l'annulation du bouton et de la Textfield, utilisez ceci:
[self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:UIColor.blueColor];
C'est la solution la plus facile.
let textField = self.searchBar.value(forKey: "searchField") as! UITextField
textField.tintColor = UIColor.white
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = .black
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 }
}