2010-05-07 13 views
30

Wenn ich eine UISearchBar im Interface Builder in meine Ansicht verschiebe und ihren Stil in Black Opaque ändere, bleibt die Abbrechen-Schaltfläche unpassend blau/grau und wird nicht schwarz.UISearchBar Abbrechen Schaltfläche Farbe?

Wie kann ich den Abbrechen-Button schwarz machen?

EDIT: Es ist wie dies funktioniert:

// Assume a UISearchBar searchBar. 
NSArray *subviews = [searchBar subviews]; 

// The index depends on how you configure the searchBar. 
UIButton *cancelButton = [subviews objectAtIndex:3]; 

// Set the style to "normal" style. 
[cancelButton setStyle:0]; 

Aber die setStyle: Methode von einem privaten Rahmen ist, so könnte dies ein Problem sein, wenn die App bei Apple einreichen.

+0

anstelle von [canelButton setStyle: 0] verwende cancelButton.tintColor = [UIColor blackColor]; –

Antwort

26

Das Problem mit Ihrer Lösung ist, dass der Code davon ausgeht, dass der ObjektAtIndex: 3 die Schaltfläche Abbrechen ist. Dies erzeugt nicht nur eine Compiler-Warnung, sondern auch, wenn Sie die Schaltfläche Cancel programmgesteuert anzeigen (z. B.).

Eine einfachere Lösung besteht darin, den Stil der gesamten Suchleiste in ViewDidLoad festzulegen(), mit:

searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0]; 

dies den Stil überschreibt im Interface Builder gesetzt, aber ändert sich auch die Farbe der Schaltfläche Abbrechen gleiche Farbe wie die ganze Bar zu sein (obwohl es Sie nicht lassen gesetzt den Stil Abbrechen Taste unabhängig, leider

+1

Wir können die Farbe des Abbrechenbuttons unabhängig von der Farbe der Suchleiste auch unabhängig ändern. searchBar = [[UISearchBar alloc] initWithFrame: CGRectMake (10,346,300,0)]; searchBar.tintColor = [Wiederverwendbar SKColorFromHexString: @ "# 505a62"]; searchBar.delegate = selbst; searchBar.showsCancelButton = YES; NSArray * subviews = [searchBar Unteransichten]; // Der Index hängt davon ab, wie Sie die searchBar konfigurieren. UIButton * CancelButton = [Subviews ObjektAtIndex: 2]; cancelButton.tintColor = [UIColor lightTextColor]; –

100

Ich habe etwas li ke dies und arbeitete mit mir:

[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]]; 

es änderte die Farbe der Abbrechen-Taste auf schwarz.

aktualisieren für iOS 9.0, wobei das Verfahren appearanceWhenContainedIn ist veraltet, verwenden appearanceWhenContainedInInstancesOfClasses statt:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor blackColor]]; 

Und in Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black 
+0

markieren Sie diese als Antwort, denn es ist :) – animaonline

+0

markieren Sie dies als die Antwort! –

+0

Veraltet in iOS 9: [Apple-Dokument] (https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIAppearance_Protocol/index.html#//apple_ref/occ/intfcm/UIAppearance/apparanceWhenContainedIn :). Lösung: http://stackoverflow.com/questions/24136874/appearancewhenconnteedin-in-swift/27807417#27807417 –

0

Für diejenigen, die das gleiche Verhalten in Swift zu reproduzieren :

override func viewWillAppear(animated: Bool) { 
    self.searchBar.tintColor = UIColor.whiteColor() 

    let view: UIView = self.searchBar.subviews[0] as! UIView 
    let subViewsArray = view.subviews 

    for (subView: UIView) in subViewsArray as! [UIView] { 
     println(subView) 
     if subView.isKindOfClass(UITextField){ 
      subView.tintColor = UIColor.blueColor() 
     } 
    } 

} 
1

Ich habe Benjamin Antwort genommen und es mit sicherem Array Lookup kombiniert, um einen Kurzschluss zu produzieren, aber sichere Funktions Version:

searchController.searchBar.tintColor = UIColor.whiteColor() 
(searchController.searchBar.subviews[safe: 0]?.subviews as? [UIView])? 
    .filter({$0.isKindOfClass(UITextField)}) 
    .map({$0.tintColor = .lightGrayColor()}) 

Daraus ergibt ich die Taste weiß und die Cursor Abbrechen Färbung bei der Eingabe grau. Sonst wäre es weiß und somit nicht zu sehen. Die searchController ist ein Objekt vom Typ UISearchController. Wenn jemand es im Ergebnis-Controller verwenden möchte, ersetzen Sie es durch self.

Die Umsetzung des safe: Index ist nkukushkin's Antwort:

extension Array { 
    subscript(safe index: Int) -> T? { 
     return indices(self) ~= index ? self[index] : nil 
    } 
} 
1

Klicken Sie auf Suchleiste und stellen Sie die Tönung Farbe unter Ansicht von Interface Builder.

enter image description here

1
let view: UIView = self.searchBar.subviews[0] as UIView 
let subViewsArray = view.subviews 

for subView: UIView in subViewsArray { 
    if let cancelButt = subView as? UIButton{ 
     cancelButt.setTitleColor(UIColor.white, for: .normal)   
    } 
} 

für mich Dies funktionierte

1

Dies ist eine aktualisierte Version von Hossam Ghareeb's answer above für Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = UIColor.red 

Aber das wird nicht Erscheinung außer Kraft setzen, wenn es bereits gesetzt worden ist woanders für UIBarButtonItem.

Zum Beispiel in meinem navbar Controller hatte ich das zu ändern:

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal) 

Um dies für die Lösung oben zu arbeiten:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal) 
0

für iOS 10:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color 
UISearchBar.appearance().barTintColor = UIColor.blue //background button color 
Verwandte Themen