2009-09-10 7 views
11

Busqué la documentación y no pude encontrar nada para cambiar el color de UISearchBar. ¿Alguien sabe cómo cambiarlo? No hay ninguna propiedad textColor:/UISearchBar texto color

Thx

+0

Frickin insana, se necesita mucho pirateo para cambiar el color del texto de una barra de búsqueda, ¡Vamos! –

Respuesta

3

sospecho que podría utilizar las técnicas descritas en this post

modificar el código presentado allí un poco, que subclase UISearchBar:

@interface SearchBar : UISearchBar { 
} 
@end 

Entonces en su implementación:

- (void)layoutSubviews { 
    UITextField *searchField; 
    NSUInteger numViews = [self.subviews count]; 
    for(int i = 0; i < numViews; i++) { 
     if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) { 
      searchField = [self.subviews objectAtIndex:i]; 
     } 
    } 
    if(!(searchField == nil)) { 
     searchField.textColor = [UIColor redColor]; 
    } 

    [super layoutSubviews]; 
} 

No he probado ni el código de la publicación original ni este código, pero parece que debería funcionar. -wkw

10

Puede hacer lo siguiente: Simplemente obtenga la propiedad searchField de SearchBar, y luego cambie su propiedad textColor.

UITextField *searchField = [searchbar valueForKey:@"_searchField"]; 
searchField.textColor = [UIColor redColor]; //You can put any color here. 

Eso es todo! Ahora manipula el campo de texto de cualquier manera posible.

+3

Espero que haya ayudado. – GeoExperts

+0

Sí, es la manera más fácil de hacerlo, muchas gracias – Burjua

+5

¿No es este un método privado? – dacopenhagen

3

Aquí es una categoría que se añade esta funcionalidad:

@implementation UISearchBar (UISearchBar_TextColor) 

- (UITextField *)field { 
    // HACK: This may not work in future iOS versions 
    for (UIView *subview in self.subviews) { 
     if ([subview isKindOfClass:[UITextField class]]) { 
      return (UITextField *)subview; 
     } 
    } 
    return nil; 
} 

- (UIColor *)textColor { 
    return self.field.textColor; 
} 

- (void)setTextColor:(UIColor *)color { 
    self.field.textColor = color; 
} 

@end 
+0

No funcionó en iOS7, porque UITextField se mueve más profundamente en la jerarquía. Esto funciona: // Hack: Esto puede no funcionar en las futuras versiones de iOS para (UIView * subvista en bar.subviews) {if ( [isKindOfClass subvista: [clase] UITextField]) { retorno (UITextField *) subvista ; } else { para (subvista2 de UIView * en subvista.subviews) { if ([subvista2 esKindOfClass: [clase UITExtField]]) { return (UITextField *) subvista2; } } } } –

+0

Nuevos desarrolladores ios, esta no es la respuesta para elegir cuando apple proporciona una API para establecer propiedades de aspecto. Looping a través de subvistas casi nunca es la solución correcta. – hhanesand

0

Aquí es un enfoque más limpio:

UITextField *searchField = nil; 

for (UIView *v in self.searchBar.subviews) 
{ 
    if ([v isKindOfClass:[UITextField class]]) 
    { 
     searchField = (UITextField *)v; 
     break; 
    } 
} 

if (searchField) 
{ 
    searchField.textColor = [UIColor whiteColor]; 
} 
10

Funciona en iOS 7 y posterior:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{ 
           NSForegroundColorAttributeName : [UIColor whiteColor], 
           NSFontAttributeName : [UIFont systemFontOfSize:15] 
           }]; 

También puede quitar el atributo no utilizado.

ACTUALIZACIÓN. Debido a appearanceWhenContainedIn está en desuso en IOS 9, véase la respuesta de la Dishant a continuación: https://stackoverflow.com/a/38893352/2799722

+1

Funciona perfectamente en iOS 8. – ashForIos

0

Modificado categoría sugerida por David Foster (@ David Foster) para trabajar en iOS 8.

static UITextField *PBFindTextFieldInView(UIView *view) { 
    for(UIView *subview in view.subviews) { 
     if([subview isKindOfClass:UITextField.class]) { 
      return (UITextField *)subview; 
     } else { 
      UITextField* textField = PBFindTextFieldInView(subview); 
      if(textField) { 
       return textField; 
      } 
     } 
    } 
    return nil; 
} 

@implementation UISearchBar (Appearance) 

- (UITextField *)field { 
    return PBFindTextFieldInView(self); 
} 

- (UIColor *)textColor { 
    return self.field.textColor; 
} 

- (void)setTextColor:(UIColor *)color { 
    self.field.textColor = color; 
} 

@end 
2

appearanceWhenContainedIn es obsoleto en iOS 9, entonces tenemos que usar el método de abajo para iOS 9 y superior.

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] 
setTintColor:[UIColor whiteColor]]; 
1

con IOS 11 Se espera que la barra de búsqueda para convertirse en parte de la barra de navegación que, como era de esperar, añade todo tipo de nuevas "características".

Creo que es un error, pero me di cuenta que tenía que hacer lo siguiente para cambiar el texto (y botón de cancelación) Color:

self.searchController.searchBar.barStyle = UISearchBarStyleMinimal; 
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] 
    setTintColor:[UIColor whiteColor]]; 

me encontré con que el estilo de la barra, cuando se deja en "default , "haría que el texto fuera negro sin importar el color del tinte, etc.Cuando se establece en Mínimo o Prominente, el texto era visible.

2

Para iOS11, encontré esto funcionó:

Después de ajustar el searchController en el navigationItem, el texto de búsqueda era negro sobre negro. Para que sea blanco, tuve que hacer:

searchController.searchBar.barStyle = .blackTranslucent 

Era lo único que funcionó para mí. Mi aplicación tiene una barra de navegación transparente para dejar que el gradiente de fondo mostrar a través de, y supongo que seguirán la barra de búsqueda toma en ese aspecto ya que mis parámetros de aspecto para UISearchBar fueron ignoradas en gran medida con una excepción:

UISearchBar.appearance().tintColor = UIColor.red 

Esto hizo que el botón Cancelar y el cursor de inserción de texto rojo. El texto del marcador de posición era gris claro.

Tenga en cuenta que: UISearchBar.appearance().barStyle = .blackTranslucent no funcionó - se tuvo que configurar en la instancia. Esto tampoco tuvo un efecto visible en la barra de búsqueda (todavía era transparente como la barra de navegación); simplemente hizo que el texto de búsqueda sea blanco.

0

Después de ajustar el searchController en el navigationItem para iOS 11, encontré que el intento de establecer la textColor través UIAppearance para cualquier UITextField dentro de un UISearchBar no tuvo ningún efecto, sino una propiedad aspecto personalizado que simplemente se llama regular textColor funcionaba bien.

// Implement a custom appearance property via a UITextField category 
@interface UITextField (SearchBarTextColor) 

@property (nonatomic, strong) UIColor * textColorWorkaround UI_APPEARANCE_SELECTOR; 

@end 

@implementation UITextField (SearchBarTextColor) 

- (UIColor *)textColorWorkaround { 
    return self.textColor; 
} 

- (void)setTextColorWorkaround:(UIColor *)textColor { 
    self.textColor = textColor; 
} 

@end 

Y a continuación, utilizar la siguiente manera:

UITextField *textFieldProxy = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class]]; 
textFieldProxy.textColorWorkaround = UIColor.lightGrayColor; 

P. S. El mismo truco me ayudó a colorear las etiquetas aparentemente inaccesibles de UIDatePicker y UIPickerView