wake-up-neo.com

Farbe der Schaltfläche "UISearchBar-Abbrechen"?

Wenn ich eine UISearchBar in meine Ansicht in Interface Builder lege und ihren Stil in "Schwarz undurchsichtig" ändere, bleibt die Abbrechen-Schaltfläche unpassend blau/grau und wird nicht schwarz.

Wie kann ich die Abbruchtaste schwarz machen?

EDIT: Es funktioniert so:

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

Die setStyle:-Methode stammt jedoch aus einem privaten Framework, sodass dies ein Problem sein kann, wenn die App an Apple gesendet wird.

35
cactus

Ich habe so etwas verwendet und mit mir gearbeitet:

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

die Abbruchschaltflächenfarbe wurde in Schwarz geändert.

Update für iOS 9.0 ist die Methode appearanceWhenContainedIn veraltet, verwenden Sie stattdessen appearanceWhenContainedInInstancesOfClasses:

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

Und in Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black
108
Hossam Ghareeb

Das Problem bei Ihrer Lösung ist, dass der Code davon ausgeht, dass objectAtIndex: 3 die Schaltfläche zum Abbrechen ist. Dies generiert nicht nur eine Compiler-Warnung, sondern auch, wenn Sie die Schaltfläche "Abbrechen" programmatisch anzeigen (z. B. mit [searchBar setShowsCancelButton:YES] können Sie die Anwendung zum Absturz bringen.

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

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

dadurch wird der im Interface Builder festgelegte Stil überschrieben. ABER ändert jedoch auch die Farbe der Schaltfläche "Abbrechen" in dieselbe Farbe wie die gesamte Leiste (obwohl Sie den Stil der Schaltfläche "Abbrechen" leider nicht unabhängig festlegen können. 

30
Alun

Versuchen Sie dies und sehen Sie: (Ich habe Code mit Swift 4.1 getestet - Xcode 9.3-beta4 )

@IBOutlet weak var sbSearchBar: UISearchBar!

sbSearchBar.tintColor = UIColor.red
sbSearchBar.showsCancelButton = true
sbSearchBar.barTintColor = UIColor.blue
sbSearchBar.tintColor = UIColor.red

if let buttonItem = sbSearchBar.subviews.first?.subviews.last as? UIButton {
    buttonItem.setTitleColor(UIColor.yellow, for: .normal)
}

 enter image description here

4
Krunal

Dies ist eine aktualisierte Version von Hossam Ghareebs Antwort oben für Swift 3:

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

Das Erscheinungsbild wird jedoch nicht überschrieben, wenn es bereits für UIBarButtonItem an anderer Stelle festgelegt wurde.

Zum Beispiel musste ich in meinem Navbar-Controller Folgendes ändern:

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

Um für die Lösung oben zu funktionieren:

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

In Swift 4.2

let appearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(named: "goldColor")!], for: .normal)

Das funktioniert für mich. Vielen Dank @Tim Semple

2
black_pearl

Klicken Sie auf die Suchleiste und legen Sie die Farbe tint vom Interface Builder aus fest.

 enter image description here

1
Rishab

für iOS 10:

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

Ich habe Benjamins answer genommen und mit der sicheren Array-Suche kombiniert, um eine kurze, aber sichere funktionale-Version zu erzeugen:

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

Dies führt dazu, dass die Schaltfläche "Abbrechen" weiß und der Cursor beim Eingeben von Grau angezeigt wird. Sonst wäre es weiß und somit nicht zu sehen. Die Variable searchController ist ein Objekt vom Typ UISearchController. Wenn jemand es innerhalb des Ergebniscontrollers verwenden möchte, ersetzen Sie es durch self.

Die Implementierung des safe:-Indexes lautetnkukushkinsanswer:

extension Array {
    subscript(safe index: Int) -> T? {
        return indices(self) ~= index ? self[index] : nil
    }
}
1
Michal
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)         
    }
}

Das hat für mich funktioniert

1
Ghadeer

Für diejenigen, die dasselbe Verhalten in Swift reproduzieren möchten: 

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()
        }
    }

}
0
Benjamin