2009-09-10 10 views
11

Sfogliata la documentazione e non sono riuscito a trovare nulla per modificare il colore di UISearchBar. Qualcuno sa come cambiarlo? Non c'è alcuna proprietà textColor:/Colore testo UISearchBar

Thx

+0

Frickin folle ci vuole così tanto hacking per cambiare il colore del testo di una barra di ricerca, forza mela! –

risposta

3

Ho il sospetto che si potrebbe usare tecniche descritte nel this post

modificando il codice presentato lì un po ', si sottoclasse UISearchBar:

@interface SearchBar : UISearchBar { 
} 
@end 

Poi nella tua implementazione:

- (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]; 
} 

Non ho testato né il codice del post originale né questo codice, ma sembra che dovrebbe funzionare. -wkw

10

È possibile effettuare le seguenti operazioni: Basta ottenere la proprietà searchField dal SearchBar e quindi modificare la proprietà textColor.

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

Questo è tutto! Ora puoi manipolare il campo testo in qualsiasi modo possibile.

+3

Spero che questo abbia aiutato. – GeoExperts

+0

Sì, è il modo più semplice per farlo, grazie mille – Burjua

+5

Non è un metodo privato? – dacopenhagen

3

Ecco una categoria che aggiunge questa funzionalità:

@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

Non ha funzionato in iOS7, perché UITextField viene spostato più in profondità nella gerarchia. Questo funziona: // HACK: Questo potrebbe non funzionare nelle future versioni di iOS per (UIView * visualizzazione secondaria in bar.subviews) {if ( [isKindOfClass visualizzazione secondaria: [class] UITextField]) { ritorno (UITextField *) visualizzazione secondaria ; } else { per (UIView * subview2 in subview.subviews) { if ([subview2 isKindOfClass: [UITextField class]]) { return (UITextField *) subview2; } } } } –

+0

Nuovi sviluppatori ios, questa non è la risposta da selezionare quando Apple fornisce l'API per l'impostazione delle proprietà di aspetto. Andare a fondo nelle sottoview non è quasi mai la soluzione giusta. – hhanesand

0

Ecco un approccio più pulito:

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

Funziona su iOS 7 e versioni successive:

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

È possibile rimuovere anche l'attributo non utilizzato.

UPDATE. A causa appearanceWhenContainedIn è deprecato in iOS 9, vedere la risposta del Dishant di seguito: https://stackoverflow.com/a/38893352/2799722

+1

perfetta per iOS 8. – ashForIos

0

modifica la categoria suggerita da David Foster (@ david-Foster) per lavorare su 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 è deprecato in iOS 9, quindi dobbiamo usare il metodo seguente per iOS 9 e versioni successive.

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

Con iOS 11 la barra di ricerca è destinato a diventare parte della barra di navigazione, che, come ci si potrebbe aspettare, aggiunge tutti i tipi di nuove "funzionalità".

Penso che sia un errore, ma ho scoperto che avevo bisogno di fare quanto segue per modificare il testo (e pulsante di annullamento) Colore:

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

ho scoperto che il bar in stile, quando a sinistra per "default , "renderebbe il testo nero indipendentemente dal colore della tinta, ecc.Se impostato su Minimo o Prominente, il testo era visibile.

2

Per iOS11, ho trovato questo ha funzionato:

Dopo aver impostato il searchController nel navigationItem, il testo di ricerca era nero su nero. Per renderlo bianco, ho dovuto fare:

searchController.searchBar.barStyle = .blackTranslucent 

Era l'unica cosa che ha funzionato per me. La mia applicazione ha una barra di navigazione trasparente per lasciare lo sfondo sfumato mostrare attraverso, e sto indovinando il SearchBar assume che l'aspetto dato che le mie impostazioni di visualizzazione per UISearchBar sono stati largamente ignorati con una sola eccezione:

UISearchBar.appearance().tintColor = UIColor.red 

Ciò ha reso il pulsante Annulla e il cursore di inserimento del testo rosso. Il testo segnaposto era grigio chiaro.

Si noti che: UISearchBar.appearance().barStyle = .blackTranslucent non ha funzionato - doveva essere impostato sull'istanza. Anche questo non ha avuto alcun effetto visibile sulla barra di ricerca (era ancora trasparente come la barra di navigazione); ha appena reso bianco il testo di ricerca.

0

Dopo aver impostato il searchController nella navigationItem per iOS 11, ho trovato che il tentativo di impostare la textColor via UIAppearance per qualsiasi UITextField all'interno di un UISearchBar non ha avuto effetto, ma una proprietà aspetto personalizzata che chiama semplicemente il regolare textColor funzionato bene.

// 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 

e quindi utilizzare come segue:

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

P.S. Lo stesso trucco mi ha aiutato a colorare le etichette apparentemente inaccessibili di UIDatePicker e UIPickerView