ios - Hacer el fondo de UISearchBar claro
objective-c (11)
No puedo borrar la barra de búsqueda. Intenté aclararlo estableciendo el color de fondo como claro y también coloqué una imagen en la barra de búsqueda.
También he dejado claro el fondo de la barra de búsqueda.
for (UIView *subview in self.searchBarHome.subviews) {
if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
[subview removeFromSuperview];//please help me to make clear background of uisearchbar
break;
}
}
[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
Aquí está mi solución en Swift 3 (un combo de las respuestas de Scarafone y Andrew2M):
for view in searchBar.subviews.last!.subviews {
if type(of: view) == NSClassFromString("UISearchBarBackground"){
view.alpha = 0.0
}
}
o alternativamente:
searchBar.barTintColor = UIColor.clear
searchBar.backgroundColor = UIColor.clear
searchBar.isTranslucent = true
searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
La configuración de backgroundColor y barTintColor no me funcionó con iOS 9+, me dejó con un fondo negro. Sin embargo la solución de Ruozi funcionará. Aquí está una versión rápida del mismo código.
for view in _searchBar.subviews.last!.subviews {
if view.isKindOfClass(NSClassFromString("UISearchBarBackground")!) {
view.removeFromSuperview()
}
}
La eliminación de UISearchBarBackground puede dar lugar a un comportamiento desconocido, especialmente si comienza a utilizar el elemento de forma más avanzada.
La respuesta de Ruozi fue mi solución preferida para agarrar el elemento UISearchBarBackground; sin embargo, sugeriría establecer el alfa en 0 en lugar de eliminar la vista con lo siguiente:
for (UIView *subview in [[self.searchBar.subviews lastObject] subviews]) {
if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
[subview setAlpha:0.0];
break;
}
}
Agregue el código anterior a su subclase UIViewController que contiene un IBOutlet * searchBar. Este fragmento de código obtendrá un fondo transparente tanto para iOS8 como para iOS9.
Además, puede ser una mejor decisión de diseño incluir este código en su subclase UISearchBar para evitar saturar su viewController.
Mi solución trabajando en Swift 4.1 | iOS 11.4 donde cambio los colores de fondo y texto de UISearchBar
La clave es encontrar el componente UITextField de UISearchBar y cambiar sus parámetros:
let searchTextField = searchBar.value(forKey: "searchField") as? UITextField
searchTextField?.textColor = UIColor.white
searchTextField?.backgroundColor = UIColor.red
searchTextField?.attributedPlaceholder = NSAttributedString(string: "Your Placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white.withAlphaComponent(0.5)])
Luego configuro la "búsqueda" y la imagen "clara"
//search image
searchBar.setImage(UIImage(named: "icon_search"), for: UISearchBarIcon.search, state: .normal)
//clear image
searchBar.setImage(UIImage(named: "icon_search_clear"), for: UISearchBarIcon.clear, state: .normal)
Para cualquier persona que intente encontrar una solución no hacky para esto, simplemente configure la imagen de fondo en cero en su archivo Storyboard / Xib. Literalmente, simplemente escriba nil
en el campo de la imagen de fondo de la barra UISearch.
Para cualquier persona que venga aquí y no pueda hacer que la solución de eliminación o alfa funcione para usted, asegúrese de tener su searchBar SearchStyle NO en MINIMALISTA. Cámbielo a Predeterminado y use cualquiera de los códigos proporcionados aquí
Para iOS 12, swift 4.x Un poco demasiado intrincado, pero la jerarquía de vista de depuración muestra que _UISearchBarSearchFieldBackgroundView es responsable del color de fondo. Para llegar a ella, ...
for subview in searchBar.subviews.last!.subviews {
if subview.isKind(of: NSClassFromString("UISearchBarTextField")!) {
for v in subview.subviews {
if v.isKind(of: NSClassFromString("_UISearchBarSearchFieldBackgroundView")!) {
v.removeFromSuperview()
}
}
}
}
Esto es demasiado hacky Prefiero pedir al diseñador que acepte el color predeterminado de Apple.
Para iOS7 +, todo lo que necesitas hacer es:
[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBarTintColor:[UIColor clearColor]]; //this is what you want
NOTA : Esto no funcionará para iOS6
Para iOS6 +, lo siguiente se hará cargo incluso en iOS7:
[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBackgroundImage:[UIImage new]];
[self.searchBarHome setTranslucent:YES];
Subclase la uisearchbar y anule los métodos initWithFrame y initWithCoder y establezca el color de fondo como
// For searchbar created programmatically
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self configureSetup];
}
return self;
}
// For search bar created on xib
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self configureSetup];
}
return self;
}
- (void)configureSetup
{
self.backgroundColor = [UIColor clearColor];
}
y use la barra de búsqueda subclasificada en lugar de donde especificó UISearchBar
UISearchBar incluye dos subvistas, son ''UISearchBarBackground'' y ''UITextField''. En IOS8, debes eliminar ''UISearchBarBackground'' para borrarlo.
for (UIView *subview in [[yourSearchBar.subviews lastObject] subviews]) {
if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
[subview removeFromSuperview];
break;
}
}
extension UISearchBar {
func changeSearchBarColor(fieldColor: UIColor, backColor: UIColor, borderColor: UIColor?) {
UIGraphicsBeginImageContext(bounds.size)
backColor.setFill()
UIBezierPath(rect: bounds).fill()
setBackgroundImage(UIGraphicsGetImageFromCurrentImageContext()!, for: UIBarPosition.any, barMetrics: .default)
let newBounds = bounds.insetBy(dx: 0, dy: 8)
fieldColor.setFill()
let path = UIBezierPath(roundedRect: newBounds, cornerRadius: newBounds.height / 2)
if let borderColor = borderColor {
borderColor.setStroke()
path.lineWidth = 1 / UIScreen.main.scale
path.stroke()
}
path.fill()
setSearchFieldBackgroundImage(UIGraphicsGetImageFromCurrentImageContext()!, for: UIControlState.normal)
UIGraphicsEndImageContext()
}
}