sale novedades mods lanzamiento fecha español cuando crafteos ios cocoa-touch uisearchbar background-color uibarbuttonitem

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)


Haga clic en la barra de búsqueda y establezca el color del tinte bajo vista desde Interface Builder.


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í