ios - novedades - ¿UISearchBar cancela el color del botón?
minecraft 1.13 mods (9)
Cuando dejo caer una UISearchBar en mi vista dentro de Interface Builder, y cambio su estilo a Black Opaque, el botón de cancelación permanece desajustado en azul / gris y no se vuelve negro.
¿Cómo puedo hacer que el botón Cancelar sea negro?
EDITAR: Funciona así:
// 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];
Pero el método setStyle:
es de un marco privado, por lo que podría ser un problema al enviar la aplicación a Apple.
El problema con su solución es que el código está asumiendo que objectAtIndex: 3 es el botón cancelar. Esto no solo genera una advertencia de compilación, sino que también, si está mostrando el botón Cancelar mediante programación (por ejemplo, utilizando [searchBar setShowsCancelButton:YES]
, corre el riesgo de bloquear la aplicación.
Una solución más simple es establecer el estilo de toda la barra de búsqueda en ViewDidLoad (), usando:
searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];
esto anula el estilo establecido en el Creador de interfaces PERO también cambia el color del botón Cancelar para que sea del mismo color que la barra completa (aunque no le permite configurar el estilo del botón Cancelar de forma independiente, desafortunadamente.
Esta es una versión actualizada de la respuesta anterior de Hossam Ghareeb para Swift 3:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self] ).tintColor = UIColor.red
Pero esto no anulará la apariencia si ya se ha establecido en otro lugar para UIBarButtonItem.
Por ejemplo, en mi controlador de la barra de navegación tuve que cambiar esto:
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)
Para esto, para que la solución anterior funcione:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self] ).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)
Para aquellos que buscan reproducir el mismo comportamiento en 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()
}
}
}
Pruebe esto y vea: ( Probé el código a continuación con 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)
}
Tomé la respuesta de Benjamin y la combiné con la búsqueda segura de Array
para producir una versión funcional corta pero segura :
searchController.searchBar.tintColor = UIColor.whiteColor()
(searchController.searchBar.subviews[safe: 0]?.subviews as? [UIView])?
.filter({$0.isKindOfClass(UITextField)})
.map({$0.tintColor = .lightGrayColor()})
Esto da como resultado colorear el botón Cancelar en blanco y el cursor al escribir en gris. De lo contrario, sería blanco y, por lo tanto, no se verá. searchController
es un objeto de tipo UISearchController
. Si alguien quiere usarlo dentro del controlador de resultados, reemplácelo por self
.
La implementación de la safe:
subíndice es nkukushkin''s respuesta nkukushkin''s :
extension Array {
subscript(safe index: Int) -> T? {
return indices(self) ~= index ? self[index] : nil
}
}
Usé algo así y trabajé conmigo:
[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]];
cambió el color del botón cancelar a negro.
Actualización para iOS 9.0, el método appearanceWhenContainedIn
está en desuso, use appearanceWhenContainedInInstancesOfClasses
lugar:
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor blackColor]];
Y en Swift 3:
UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black
para iOS 10:
UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
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)
}
}
Esto funcionó para mí