2012-08-06 4 views
33

Hat jemand eine Idee oder ein Codebeispiel dazu, wie kann ich die Textfarbe des Platzhaltertextes einer UISearchBar ändern?UISearchBar ändern Platzhalterfarbe

+0

Ich denke, diese Post Sie http helfen: // Stackoverflow. com/questions/1340224/iphone-uitextfield-change-placeholder-text-farbe – frankWhite

+0

Ich habe es schon angeschaut. Dieser Beitrag betrifft ein UITextfield. Das Subclassing eines UITextfield und das Überschreiben der -drawPlaceholderInRect-Methode würde sicherlich helfen. UISearchBar ist jedoch keine Unterklasse von UITextfield und daher kann ich diese Methode nicht überschreiben. – csotiriou

+0

Entschuldigung, ich weiß das nicht. UISearchBar ist eine Unterklasse von UIView, und ich denke, Sie können daraus eine Unterklasse erstellen und die Methode drawRect überschreiben, indem Sie Code aus dem vorherigen Beitrag hinzufügen. Vielleicht diese Hilfe – frankWhite

Antwort

70

für iOS5+ das Erscheinungsbild Proxy

[[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]]; 
+0

Seit meinem Post hatte ich die Antwort gefunden, und das ist tatsächlich der beste Weg, es zu tun. Sauber, einfach und es macht nichts kaputt. – csotiriou

+6

Dies ist nicht wirklich gültig. UILabel unterstützt die Anpassung auf diese Weise nicht, da die Eigenschaft 'textColor' von UILabel nicht mit 'UI_APPEARANCE_SELECTOR' gekennzeichnet ist, wie in der Dokumentation gefordert. Siehe auch http://stackoverflow.com/questions/11839044/how-do-i-apply-uiappearance-proxy-properties-to-uilabel –

+0

Dies funktioniert nur für mich, wenn ich einen Platzhalter in Stroyboard hinzufügen .. Direkte Einstellung Platzhalter Durch Code funktioniert nicht, wenn wir nicht einen Platzhalter im Storyboard haben .. verdrahtet – sach

-2

Try this:

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

Ich möchte nicht die Farbe ändern der normale Text. Ich möchte die Farbe des Platzhaltertexts ändern. – csotiriou

+4

Das ist NICHT OK! Sie greifen auf einen PRIVATE iVAR zu, wenn Sie dies tun, und dies könnte dazu führen, dass Ihre App vom App Store abgelehnt wird. –

+0

@AlexanderW: Wenn dies nicht verwendet werden sollte, werden Sie nicht in der Lage sein, darauf zuzugreifen ... Jeder auf der ganzen Welt verwenden dieses Ding zum Ändern der Farbe des Textfelds Platzhalter Farbwechsel .... meine App wurde nie zurückgewiesen aufgrund dessen ... aber es ist nur eine Lösung, vielleicht nicht eine perfekte ..... – Ankit

28

Konnten Sie die Antwort von Change UITextField's placeholder text color programmatically

// Get the instance of the UITextField of the search bar 
UITextField *searchField = [searchBar valueForKey:@"_searchField"]; 

// Change search bar text color 
searchField.textColor = [UIColor redColor]; 

// Change the search bar placeholder text color 
[searchField setValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"]; 
+0

Wer hat versucht, eine App mit diesem Code einzureichen? Sollte kein großes Problem sein ... aber wer kann das sicher sagen ... – jimpic

+2

Obwohl dieser Code funktioniert, würde ich jedem App-Submission damit vertrauen, da es Apple-Vorschriften verletzt. – csotiriou

+0

Meine App ist in Ordnung, mit dieser Lösung Appstore zu übermitteln. :) – Senry

3

Try this:

[self.searchBar setValue:[UIColor whatever] forKeyPath:@"_searchField._placeholderLabel.textColor"]; 

Sie auch diese in Storyboard, wählen Sie Suchleiste festlegen können, fügen Sie Eintrag unter User Defined Runtime Attribute:

_searchField._placeholderLabel.textColor 

vom Typ Farbe und wählen Sie die Farbe, die du brauchst.

15

Erste Lösung ist in Ordnung, aber wenn Sie mehrere UISearchBar verwenden oder viele Instanzen erstellen, kann es fehlschlagen. Die einzige Lösung, die für mich immer arbeiten, ist auch Proxy-Aussehen zu verwenden, sondern direkt auf UITextField

NSDictionary *placeholderAttributes = @{ 
              NSForegroundColorAttributeName: [UIColor darkButtonColor], 
              NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:15], 
              }; 

    NSAttributedString *attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.searchBar.placeholder 
                       attributes:placeholderAttributes]; 

    [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setAttributedPlaceholder:attributedPlaceholder]; 
+0

Es ist die einzige Lösung, die für mich richtig funktioniert, andere Lösungen scheiterten beim Navigieren der ViewController-Hierarchie hin und her und beim Zerstören/Neuerstellen der Suchleiste – DTs

0

Nach ein paar Antworten befragt, ich dies herauskommen, hoffen seine Hilfe

for (UIView *subview in searchBar.subviews) { 
    for (UIView *sv in subview.subviews) { 
     if ([NSStringFromClass([sv class]) isEqualToString:@"UISearchBarTextField"]) { 

      if ([sv respondsToSelector:@selector(setAttributedPlaceholder:)]) { 
       ((UITextField *)sv).attributedPlaceholder = [[NSAttributedString alloc] initWithString:searchBar.placeholder attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}]; 
      } 
      break; 
     } 
    } 
} 
+0

Ich unterklassifizierte die UISearchBar-Klasse, und dann verwendete ich einen zugewiesenen Platzhalter wie Sie. Aber in meiner Unterklasse habe ich override var Platzhalter hinzugefügt: String? { didSet { changePlaceholderColor (str: Platzhalter ?? "") } }, wenn ich den Platzhaltertext in dieser searchBar ändere, wird der Platzhaltertext automatisch die richtige Farbe haben. Wenn ich dies nicht tun würde, würde es meine Platzhalterfarbe überschreiben, wenn ich jemals einen normalen Platzhalter setzen würde. –

12

Hier a Lösung für Swift:

Swift 2

var textFieldInsideSearchBar = searchBar.valueForKey("searchField") as? UITextField 
textFieldInsideSearchBar?.textColor = UIColor.whiteColor() 

var textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.valueForKey("placeholderLabel") as? UILabel 
textFieldInsideSearchBarLabel?.textColor = UIColor.whiteColor() 

Swift 3

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField 
textFieldInsideSearchBar?.textColor = UIColor.white 

let textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.value(forKey: "placeholderLabel") as? UILabel 
textFieldInsideSearchBarLabel?.textColor = UIColor.white 
+0

ist es öffentliche API? – Andrey

+0

Ich denke schon. Es ist die gleiche Lösung, die andere Benutzer empfehlen. – derdida

+0

Wie wäre es mit der 'prompt' ?! (nicht der Platzhalter) – fatuhoku

0

Setzen Sie diese in viewDidLoad Ihren Viewcontroller (Arbeits auf iOS 9):

UITextField *searchField = [self.searchBar valueForKey:@"_searchField"]; //self.searchBar is mine targeted searchBar, replace with your searchBar reference 

// Change search bar text color 
searchField.textColor = [UIColor whiteColor]; 

// Change the search bar placeholder text color 
[searchField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"]; 

//Change search bar icon if needed 
[self.searchBar setImage:[UIImage imageNamed:@"searchIcon"] 
    forSearchBarIcon:UISearchBarIconSearch 
       state:UIControlStateNormal]; 
+3

Ich habe den Slogan von Ihren letzten Antworten entfernt - es ist in einer Antwort hier nicht nützlich. Vielen Dank! – Undo

+0

'[ setValue: forUndefinedKey:]: Diese Klasse ist für den Schlüssel _placeholderLabel.textColor nicht schlüsselcodefähig.' –

6
if let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as ? UITextField { 
    textFieldInsideSearchBar ? .textColor = UIColor.white 

    if let textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.value(forKey: "placeholderLabel") as ? UILabel { 
     textFieldInsideSearchBarLabel ? .textColor = UIColor.white 

     if let clearButton = textFieldInsideSearchBar ? .value(forKey: "clearButton") as!UIButton { 

      clearButton.setImage(clearButton.imageView ? .image ? .withRenderingMode(.alwaysTemplate), 
       for : .normal) 
      clearButton.tintColor = UIColor.white 
     } 
    } 

    let glassIconView = textFieldInsideSearchBar ? .leftView as ? UIImageView 

    glassIconView ? .image = glassIconView ? .image ? .withRenderingMode(.alwaysTemplate) 
    glassIconView ? .tintColor = UIColor.white 
} 
0

Swift 3

UILabel.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.white 
0

Diese Lösung funktioniert auf Xcode 8.2.1. mit Swift 3.0. :

extension UISearchBar 
{ 
    func setPlaceholderTextColorTo(color: UIColor) 
    { 
     let textFieldInsideSearchBar = self.value(forKey: "searchField") as? UITextField 
     textFieldInsideSearchBar?.textColor = color 
     let textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.value(forKey: "placeholderLabel") as? UILabel 
     textFieldInsideSearchBarLabel?.textColor = color 
    } 
} 

Anwendungsbeispiel:

searchController.searchBar.setPlaceholderTextColorTo(color: mainColor) 
0

Dies ist eine alte Frage, aber für jedermann auf sie heute stolpern, können Sie das Suchsymbol auf iOS 8.x ändern - 10.3 mit dem folgenden:

[_searchBar setImage:[UIImage imageNamed:@"your-image-name"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal]; 

den Platzhalter-Text-Farbe betrifft, so können Sie meine andere Antwort, überprüfen, die eine Kategorie verwendet, hier: UISearchBar change placeholder color