Wie kann ich die Textfarbe von a ändern UISearchBar
?
Antworten:
Sie müssen auf das UITextField
Innere der UISearchBar zugreifen. Sie können dies mit verwendenvalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Swift 3 Update
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
über KVC zugreifen .
Arbeiten in Swift 4 für mich:
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]
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
}
}
Dies funktioniert bei mir unter iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Ich schreibe es in die, AppDelegate
aber ich denke, es funktioniert, wenn Sie es auch woanders platzieren.
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
folgt : Dies ist natürlich Objective-C, mit offensichtlicher Übersetzung in Swift unter Verwendung vonappearance(whenContainedInInstancesOf:)
Ich denke, der bequemste Weg ist, eine textColor
Immobilie einzurichten UISearchBar
.
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
}
}
}
}
Verwendung
searchBar.textColor = UIColor.blue // Your color
Swift 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
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? {
if #available(iOS 13.0, *) {
return searchTextField
}
guard let firstSubview = subviews.first else {
assertionFailure("Could not find text field")
return nil
}
for view in firstSubview.subviews {
if let textView = view as? UITextField {
return textView
}
}
assertionFailure("Could not find text field")
return nil
}
}
Sie können es auch nicht optional mit schwerwiegenden Fehlern machen, dieser Code wird seit iOS 7 bis iOS 13GM getestet. Aber ich würde mich einfach für die optionale Version entscheiden.
extension UISearchBar {
public var textField: UITextField {
if #available(iOS 13.0, *) {
return searchTextField
}
guard let firstSubview = subviews.first else {
fatalError("Could not find text field")
}
for view in firstSubview.subviews {
if let textView = view as? UITextField {
return textView
}
}
fatalError("Could not find text field")
}
}
Versuche dies,
searchBar.searchTextField.textColor = .white
Ich verwende dies mit einer App für iOS 11.
[Update] Ich habe festgestellt, dass die App bei älteren Versionen (<iOS 13) abstürzt. Der Compiler hat sich jedoch nie über die Versionsprüfung beschwert. Bitte erklären Sie jemandem, warum dies passiert ist.
Sie können dies tun, indem Sie auf das UITextField in der Suchleiste zugreifen und dann 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
}
}
Ich habe einige der oben beschriebenen Lösungen ausprobiert, aber sie haben nicht funktioniert (ich denke, mehr).
Wenn Sie nur mit iOS 13 umgehen möchten:
mySearchBar.searchTextField.textColor = .red
Aber wenn Sie auch mit älterem iOS umgehen möchten, habe ich Folgendes getan:
Erstellen Sie eine benutzerdefinierte UISearchBar
Klasse mit dem Namen " SearchBar : UISearchBar, UISearchBarDelegate
Dies SearchBar
" enthält die UISearchBarDelegate
Methoden, die ich verarbeiten möchte, und deren delegate
Satz.
Und ich füge der Klasse hinzu:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
Kurze Erklärung:
Mit iOS13 können Sie jetzt auf das UITextField
Dankeschön zugreifen UISearchBar.searchTextField
, das vom Typ ist UISearchTextField
, von dem es erbt UITextField
.
Da ich meine Hierarchie kenne, weiß ich, textField
dass dies nicht der Fall sein wirdnill
für ältere Versionen geeignet bin. In beiden Fällen erhalte ich ein Textfeld, das ich problemlos anpassen kann und das heute an jeder Version von 9 bis 13 arbeitet.
Hier ist der vollständige Code, der benötigt wird, damit es funktioniert:
class SearchBar: UISearchBar, UISearchBarDelegate {
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
override func awakeFromNib() {
super.awakeFromNib()
delegate = self
if let textField = textField {
textField.textColor = .red
textField.clearButtonMode = .whileEditing
textField.returnKeyType = .search
}
}
}
Sie können auch einige Anpassungen vornehmen, SearchBar
indem Sie diese hinzufügen auf:
let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
searchBar.backgroundImage = UIImage()
searchBar.isTranslucent = false
searchBar.returnKeyType = .search
Dann setzen Sie es auf das XIB / Storyboard und behandeln es so, als wäre es einfach UISearchBar
(wenn Sie die Delegierten nicht vergessen haben!).
Hier ist eine Xamarin.iOS C # -Version des Ansatzes "find the UITextField". Es stürzt nicht ab, wenn das UITextField in der zukünftigen Hierarchie der iOS-Ansicht 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;
}
}
}
(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
// BEARBEITEN
Der obige Code funktioniert nicht für iOS 13. Eine bessere Möglichkeit, dies zu handhaben, ist die Verwendung von:
extension UISearchBar {
var textField: UITextField? {
return self.subviews(ofType: UITextField.self).first
}
}
extension UIView {
var recursiveSubviews: [UIView] {
return self.subviews + self.subviews.flatMap { $0.recursiveSubviews }
}
func subviews<T: UIView>(ofType: T.Type) -> [T] {
return self.recursiveSubviews.compactMap { $0 as? T }
}
}
Swift 5.2 & iOS 13.3.1: -
Es funktioniert gut.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)