Wie kann ich die Textfarbe einer UISearchBar
ändern?
Sie müssen auf die Variable UITextField
in der UISearchBar zugreifen. Sie können dies tun, indem Sie valueForKey("searchField")
verwenden.
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Swift 3-Update
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
In Swift 4 für mich arbeiten:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
Swift 4.2, IOS 12:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Wenn Sie es nur vor einem dunklen Hintergrund lesbar machen müssen, können Sie den BarStyle ändern. Der folgende Text und die Schaltflächen in der Suchleiste werden weiß:
searchController.searchBar.barStyle = .black
public extension UISearchBar {
public func setTextColor(color: UIColor) {
let svs = subviews.flatMap { $0.subviews }
guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return }
tf.textColor = color
}
}
Ich denke, der bequemste Weg ist, eine textColor
-Eigenschaft in UISearchBar
zu setzen.
Swift 3.0
extension UISearchBar {
var textColor:UIColor? {
get {
if let textField = self.value(forKey: "searchField") as?
UITextField {
return textField.textColor
} else {
return nil
}
}
set (newValue) {
if let textField = self.value(forKey: "searchField") as?
UITextField {
textField.textColor = newValue
}
}
}
}
Verwendungszweck
searchBar.textColor = UIColor.blue // Your color
Schnell 2.3
extension UISearchBar {
var textColor:UIColor? {
get {
if let textField = self.valueForKey("searchField") as? UITextField {
return textField.textColor
} else {
return nil
}
}
set (newValue) {
if let textField = self.valueForKey("searchField") as? UITextField {
textField.textColor = newValue
}
}
}
}
Sie würden es verwenden als:
searchBar.textColor = UIColor.blueColor() // Your color
Dies funktioniert für mich unter iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Ich schreibe es in AppDelegate
, aber ich denke, es funktioniert, wenn Sie es auch woanders hinstellen.
Sie können dies tun, indem Sie auf das UITextField in der Suchleiste Zugreifen. Dann können Sie dessen Hintergrundfarbe, Textfarbe und alle anderen UITextField-Eigenschaften ändern
fügen Sie die folgende Erweiterung hinzu, um auf das Textfeld zuzugreifen
extension UISearchBar {
/// Return text field inside a search bar
var textField: UITextField? {
let subViews = subviews.flatMap { $0.subviews }
guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else { return nil
}
return textField
}
}
Seit Xcode 11 und iOS 13 ist es möglich, direkt auf das Textfeld zuzugreifen:
searchBar.searchTextField
Sie könnten Code schreiben, um ihn immer so zugänglich zu machen.
extension UISearchBar {
public var textField: UITextField? {
guard let firstSubview = subviews.first else {
assertionFailure("Could not find text field")
return nil
}
for view in firstSubview.subviews {
if #available(iOS 13.0, *) {
return searchTextField
} else {
if let textView = view as? UITextField {
return textView
}
}
}
assertionFailure("Could not find text field")
return nil
}
}
Sie könnten es auch nicht optional mit schwerwiegenden Fehlern machen, dieser Code wird seit iOS 7 bis iOS 13b6 getestet. Aber ich würde mich nur für die optionale Version entscheiden.
extension UISearchBar {
public var textField: UITextField {
guard let firstSubview = subviews.first else {
fatalError("Could not find text field")
}
for view in firstSubview.subviews {
if #available(iOS 13.0, *) {
return searchTextField
} else {
if let textView = view as? UITextField {
return textView
}
}
}
fatalError("Could not find text field")
}
}
(Diese Lösung wurde nur für Xcode 10 und iOS 12 getestet.) Fügen Sie eine Erweiterung hinzu, um auf das Textfeld der Suchleiste zuzugreifen:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
}
}
Verwenden Sie dann diese Eigenschaft, um die Textfarbe des Textfelds in Ihrer Suchleiste festzulegen:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
In meiner Situation liegt die Lösung
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
Hier ist eine Xamarin.iOS C # -Version des Ansatzes "Find the UITextField". Es stürzt nicht ab, wenn das UITextField in der zukünftigen iOS-Ansichtshierarchie verschwindet.
var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField);
if (tf != null)
(tf as UITextField).TextColor = UIColor.White;
public static IEnumerable<UIView> AllSubViews(this UIView view)
{
foreach (var v in view.Subviews)
{
yield return v;
foreach (var sv in v.AllSubViews())
{
yield return sv;
}
}
}