Personalizar UISearchBar: tratando de deshacerse de la línea negra de 1 px debajo de la barra de búsqueda

Mi pregunta ya está especificada en el título: me gustaría deshacerme de la línea negra dibujada en la parte inferior de UISearchBar . ¿Algunas ideas?

Aquí hay una image de lo que quiero decir:

barra de búsqueda con fondo negro

ACTUALIZACIÓN :

Creo que la línea es parte de UITableView 's tableHeaderView . Todavía no sé cómo eliminarlo.

Lo arreglé agregando una subview a la stack de vistas de la searchBar de searchBar como searchBar :

 CGRect rect = self.searchBar.frame; UIView *lineView = [[UIView alloc]initWithFrame:CGRectMake(0, rect.size.height-2,rect.size.width, 2)]; lineView.backgroundColor = [UIColor whiteColor]; [self.searchBar addSubview:lineView]; 

Aquí, self.searchBar es un puntero UISearchBar de mi class de controller.

Prueba esto

  searchBar.layer.borderWidth = 1; searchBar.layer.borderColor = [[UIColor lightGrayColor] CGColor]; 

Por qué:

Entonces, he cavado en la API tratando de averiguar por qué sucede esto. Al parecer, quien escribió la API UISearchBar está rasterizando las líneas en una image y configurándolas como backgroundImage .

Solución:

Propongo una solución más simple, si desea configurar backgroundColor y deshacerse de las líneas finas:

 searchBar.backgroundColor = <#... some color #> searchBar.backgroundImage = [UIImage new]; 

O si solo necesita una image de background sin las líneas horizontales:

 searchBar.backgroundImage = <#... some image #> 

Tengo líneas horizontales negras de 0.5px tanto en la parte superior como en la parte inferior de mi UISearchBar . La única manera que tenía hasta el momento de deshacerte de ellos es fijando su estilo en Minimal :

 mySearchBar.searchBarStyle = UISearchBarStyleMinimal; 
 controller.searchBar.layer.borderWidth = 1 controller.searchBar.layer.borderColor = UIColor(networking: 255/255, green: 253/255, blue: 247/255, alpha: 1.0).CGColor 

Respuesta para Swift basado en la respuesta de Ayush.

Establezca tableHeaderView a nil antes de colocar su UISearchBar allí.

Si eso no ayuda, intenta ocultarlo. Primero agregue su barra de búsqueda a una UIView genérica y de tamaño UIView (por ejemplo, "envoltorio") como una subvista, luego

 CGRect frame = wrapper.frame; CGRect lineFrame = CGRectMake(0,frame.size.height-1,frame.size.width, 1); UIView *line = [[UIView alloc] initWithFrame:lineFrame]; line.backgroundColor = [UIColor whiteColor]; // or whatever your background is [wrapper addSubView:line]; [line release]; 

Y luego agréguelo a tableHeaderView.

 self.tableView.tableHeaderView = wrapper; [wrapper release]; 

Esta pregunta ya se ha resuelto, pero tal vez mi solución puede ayudar a otra persona. Tuve un problema similar, excepto que estaba tratando de eliminar el borde superior de 1px.

Si subclassa UISearchBar , puede anular el marco de esta forma.

 - (void)setFrame:(CGRect)frame { frame.origin.y = -1.0f; [super setFrame:frame]; self.clipsToBounds = YES; self.searchFieldBackgroundPositionAdjustment = UIOffsetMake(0, 1.0f); } 

O si desea corregir el píxel inferior, puede hacer algo como esto (no probado).

 - (void)setFrame:(CGRect)frame { frame.origin.y = 1.0f; [super setFrame:frame]; self.clipsToBounds = YES; self.searchFieldBackgroundPositionAdjustment = UIOffsetMake(0, -1.0f); } 

Solo por simplicidad del ejemplo están los clipsToBounds y searchFieldBackgroundPositionAdjustment en setFrame .

También el searchFieldBackgroundPositionAdjustment solo es necesario para volver a centrar el campo de búsqueda.

ACTUALIZAR

Resulta que el tableView cambiará 1px desde la actualización del origin.y mientras el searchBar esté activo. Se siente un poco extraño. Me di count de que la solución es tan simple como configurar, self.clipsToBounds = YES;

Advertencia. Este es un truco. Me gustaría conocer una forma mejor y más oficial.

Puede usar el depurador de pony para averiguar dónde está la jerarquía de la subvista. Creo que lo que se ve es un UIImageView privado llamado "separador"

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; for (UIView* view in self.searchBar.subviews) { if (view.frame.size.height == 1 && [view isKindOfClass:[UIImageView class]]) { view.alpha = 0; break; } } } 

Solución para XCode 8.3.3 Swift 3.1 introduzca la descripción de la imagen aquí

Puedes usar

  [[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"someImage.png"]forState:UIControlStateNormal]; 

en iOS 5+ para deshacerse de la línea.