ios7 - Cambiar el color del cursor en UISearchBar sin cambiar tintColor
(10)
Quiero que el color de tinte de mi barra de búsqueda sea blanco (es decir, que el botón cancelar sea blanco). El cursor no es visible cuando el color del tinte es blanco. ¿Hay alguna manera de establecer el color del cursor por separado?
Swift 3.0 y 4 versión
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()
}
}
}
Tenga en cuenta que searchBar no puede ser opcional.
iOS 9 y superior
La forma más sencilla de establecer un tintColor diferente para cancelar el botón y el campo de texto, usa esto:
self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:UIColor.blueColor];
Esta es la solución más fácil.
let textField = self.searchBar.value(forKey: "searchField") as! UITextField
textField.tintColor = UIColor.white
Establezca el color del tinte en el color que desea que sea el botón cancelar y luego use el protocolo UIAppearance para cambiar el color del tinte en el campo de texto para que sea el color que desea que tenga el cursor. Ex:
[self.searchBar setTintColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor darkGrayColor]];
Esto pareció funcionar para mí también rápidamente.
searchController.searchBar.tintColor = UIColor.whiteColor()
UITextField.appearanceWhenContainedInInstancesOfClasses([searchController.searchBar.dynamicType]).tintColor = UIColor.blackColor()
Para aquellos que buscan hacer lo mismo en Swift, aquí hay una solución que me ocurrió después de un montón de problemas:
searchController.searchBar.tintColor = .white
UITextField.appearance(whenContainedInInstancesOf: [type(of: searchController.searchBar)]).tintColor = .black
Si eres aficionado a las frases funcionales pero a la vez molestas en Swift, obtuve el siguiente comentario de Benjamin:
searchController.searchBar.tintColor = UIColor.whiteColor()
searchController.searchBar.subviews[0].subviews.flatMap(){ $0 as? UITextField }.first?.tintColor = UIColor.blueColor()
Solo agregaría una extensión a UISearchBar con el siguiente código.
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)
}
}
}
Solución Compact Swift 2.0 con sintaxis para el lugar (sin necesidad de romper el bucle):
// 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()
}