Ich verstehe, dass diese Frage auf SO viele, viele Male gestellt wurde. Wie Apple jedoch am besten kann, haben sie mit der Veröffentlichung von iOS 11 eine scheinbar unnötige Änderung an UISearchBar
vorgenommen, insbesondere der Ansichtshierarchie.
Darüber hinaus ist das "Textfeld" einer Suchleiste in den Unteransichten der Suchleiste nicht mehr verfügbar, sodass alle der vorherigen Lösungen auf die Hintergrundfarbe des Textfelds oder eine Eigenschaft von "zugreifen" und diese ändern das Textfeld für diese Angelegenheit.
Zu Ihrer Information: Ich spreche speziell über die Farbe hinter dem Text ... der jetzt ab 11 standardmäßig weiß ist, es sei denn, Sie geben an, dass der Suchleistenstil minimal ist.
UPDATE 1:
Seitdem ich diese Frage gestellt habe, habe ich immer noch keine gültige oder wirklich irgendeine echte Lösung für dieses Problem gefunden. Das, was mir am nächsten zu kommen scheint, ist, tief in das Erscheinungsbild einzutauchen, zum Beispiel in Eigenschaften
[[UISearchBar class] appearanceWhenContainedInInstancesOfClasses:(nonnull NSArray<Class<UIAppearanceContainer>> *)]
des UISearchBar
name__. Mit den gefundenen UITextField
über Methoden wie die folgenden herumspielen:
if ([view isKindOfClass:[UITextField class]]) {
return (UITextField*)view;
}
UITextField *searchTextField;
for (UIView *subview in view.subviews) {
searchTextField = [self searchViewForTextFieldBg:subview];
if (searchTextField) {
break;
}
}
return searchTextField;
sie können mit dem Zeichnen einer neuen Hintergrundansicht beginnen, die sich hinter der Ansicht befindet. Die Probleme, die ich für zu mühsam befunden hatte, um sie weiter zu verfolgen, bestanden darin, die Ansicht mit den richtigen Rahmen/Grenzen zu zeichnen, um genau den ursprünglichen Hintergrund zu imitieren.
Hoffentlich kann jemand die aktuelle Lösung für dieses Problem finden. Nettes Fräulein Apple ...
Ich denke, Sie suchen das vielleicht, oder? Aber ich habe es in Swift :(
@IBOutlet weak var sbSearchBar: UISearchBar!
if let textfield = sbSearchBar.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
textfield.backgroundColor = UIColor.yellow
}
Hier ist das Ergebnis:
Dieser Code ändert die Hintergrundfarbe des Textfelds.
Swift 4
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//background color of text field
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan
}
Das ist das Ergebnis
let searchBar = UISearchBar(frame: CGRect())
let searchField: UITextField? = searchBar.value(forKey: "searchField") as? UITextField
let searchBarBackground: UIView? = searchBar.value(forKey: "background") as? UIView
// searchBarBackground?.removeFromSuperview()
if searchField != nil {
var frame = searchField?.frame
frame?.size.height = 30
searchField?.frame = frame!
searchField?.backgroundColor = .yellow
}
searchBar.barTintColor = .red
searchBar.delegate = self
searchBar.backgroundColor = .green
Wenn wir Hintergrundfarben für UISearchBar mit dem obigen Code festlegen, werden die farbigen Unteransichten als Folgebilder angezeigt (klicken Sie auf die Links, um sie anzuzeigen) . 
backgroundColor
für Superviews von UISearchBar-SubviewsDer Klassenname der grünen Ansicht ist UISearchBar im Object-Inspector.
Wenn wir also searchBar.backgroundColor = .green
verwenden, setzen wir die Hintergrundfarbe von Superview grün. Daher setzt die UISearchBar-Instanzeigenschaft backgroundColor
die Hintergrundfarbe des Superview.
barTintColor
für UISearchBarBackgroundDer Klassenname der roten Ansicht ist UISearchBarBackground im Object-Inspector.
Es gibt jedoch keine direkte Methode für den Zugriff auf die Ansicht. Wir können KVCsearchBar.value(forKey: "background") as? UIView
versuchen, searchBarBackground zu erhalten.
Wenn wir searchBar.barTintColor = .red
verwenden, setzen wir die backgroundColor-Ansicht von UISearchBarBackground auf Rot. Um zwei schwarze Ränder auf der Farbtonebene zu entfernen, müssen Sie den Hintergrund aus der Übersicht entfernen.
searchField?.backgroundColor
für UITextFieldDer Klassenname der gelben Ansicht ist _UISearchBarSearchFieldBackgroundView (Unteransicht von UISearchBarTextField) im Objektinspektor.
Es gibt keine direkte Methode für den Zugriff auf searchField, genau wie searchBarBackground. Wir können auch KVCsearchField: UITextField? = searchBar.value(forKey: "searchField") as? UITextField
verwenden, um searchField zu erhalten.
Wenn wir searchField?.backgroundColor = .yellow
verwenden, setzen wir die backgroundColor von UITextField gelb. Wenn Sie also die Hintergrundfarbe des Textfelds einstellen möchten, müssen Sie zuerst mit KVC auf das Suchfeld zugreifen
Swift 4-5
searchController.searchBar.barTintColor = .white