Cambio del background del campo de búsqueda UISearchBar

Tengo una UISearchBar contenida dentro de una UIView y la UIView se ha asignado a un UITableView's tableHeaderView. Estoy intentando UISearchBar el UISearchBar para que se vea así:

Lo que quiero

Fuera de la puerta, esto es lo que parece:

Como se ve ahora

Hay un montón de preguntas de SO y respuestas sobre cómo UISearchBar , su campo de búsqueda, etc., algunos con especial atención a los backgrounds. Muchos de ellos implican atravesar las UISearchBar's subviews , encontrar un object UISearchBarBackground (o _UISearchBarSearchFieldBackgroundView ), y establecer su color de background directamente. Estoy tratando de encontrar una API compatible para hacer esto, sin embargo …

El setSearchFieldBackgroundImage:forState: parece tener un gran potencial, pero esto es lo que obtengo cuando utilizo una image blanca (o transparente) de UIControlStateNormal usando UIControlStateNormal :

Usando una imagen transparente para setSearchFieldBackgroundImage: forState:

¿Alguna idea sobre cómo hacer que esto funcione? Agradecería que alguien me señalara a una publicación SO que contesta esto, pero realmente creo que los he leído todos. Gracias una tonelada.

puede usar the appearanceWhenContainedIn para orientar elementos sin atravesar la jerarquía de vistas. Algo como:

 [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:[UIColor whiteColor]]; [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor lightGrayColor]]; 

Creo que el problema aquí es que cuando usas setSearchFieldBackgroundImage:forState: la altura de tu image realmente determina el alto del campo de búsqueda. El campo de búsqueda estándar (al less a partir de iOS 8) tiene 28 puntos de alto, por lo que una image que la altura debería darle el efecto que buscas.

(De manera algo confusa, esto también significa que una image extensible de nueve partes generalmente no se verá bien, así que si searcha una apariencia que no fuera simplemente blanca sobre blanco, debe usar una image estirable de tres partes que solo se estira horizontalmente)

Por encima de iOS 5.0

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

Intente el siguiente código

 [[UISearchBar appearance]setBackgroundImage:[UIImage imageNamed:@“searchbar_bg.png"]]; for (UIView *searchbuttons in searchBar.subviews) { if ([searchbuttons isKindOfClass:[UIButton class]]) { UIButton *cancelbutton = (UIButton *)searchbuttons; [cancelbutton setBackgroundImage:[UIImage imageNamed:@“canelBtn.png"] forState:UIControlStateNormal]; } } UITextField *searchField = [searchBar valueForKey:@"_searchField"]; searchField.background = [UIImage imageNamed:@"bg.png"]; 

Puede usar la barTintColor o backgroundImage de UISearchBar para realizar directamente lo que está intentando hacer.

Reproduje su problema y parece solucionarlo:

 self.searchDisplayController.searchBar.barTintColor = [UIColor whiteColor]; 

o

 self.searchDisplayController.searchBar.backgroundImage = [self imageWithColor:[UIColor whiteColor]]; 

PS Si está utilizando la solución backgroundImage, necesitará hacer el método imageWithColor siguiente manera

 - (UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

¡Dime si funciona!

iO9 funciona perfecto

 - (void)viewDidLoad { [super viewDidLoad]; [[self searchSubviewsForTextFieldIn:self.searchBar] setBackgroundColor: [UIColor networkingColor]]; } - (UITextField*)searchSubviewsForTextFieldIn:(UIView*)view { if ([view isKindOfClass:[UITextField class]]) { return (UITextField*)view; } UITextField *searchedTextField; for (UIView *subview in view.subviews) { searchedTextField = [self searchSubviewsForTextFieldIn:subview]; if (searchedTextField) { break; } } return searchedTextField; } 

La respuesta de @ joneswah se describe en iOS 9.

Para iOS 9, pon esto en tu AppDelegate.m. También agregué una solución para el retraso de apertura del keyboard, cuando se inicia el keyboard por primera vez.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // Remove lag on oppening the keyboard for the first time when clicked on any UITextField UITextField *lagFreeField = [[UITextField alloc] init]; [self.window addSubview:lagFreeField]; [lagFreeField becomeFirstResponder]; [lagFreeField resignFirstResponder]; [lagFreeField removeFromSuperview]; //searchBar background color change [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBackgroundColor:[UIColor greenColor]];//background color [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blackColor];//text color return YES; } 

Como otros sugirieron, debe recorrer las subvistas de su búsqueda y encontrar la instancia de UITextField. PERO, necesita establecer su layer.backgroundColor , ya que establecer la propiedad backgroundColor no tiene efecto. Voy a dar un ejemplo:

 for view in searchBar.subviews { for subview in view.subviews { if let searchField = subview as? UITextField { searchField.layer.backgroundColor = UIColor.whiteColor().CGColor } } } 

Esto te dará lo que necesitas.

Mi respuesta funciona de manera estable en iOS 5 y superior, incluido este 10. Sin hacks y KVO, de Apple Way

El siguiente código logrará el resultado.

 _sbAddress.barTintColor = [UIColor whiteColor]; for (UIView *subView in _sbAddress.subviews) { for(id field in subView.subviews){ if ([field isKindOfClass:[UITextField class]]) { UITextField *textField = (UITextField *)field; [textField setPlaceholder:@"Search"]; } } } 

O

 [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setPlaceholder:@"Search"];