Wie kann ich die Farbe des UISearchBar-Suchtextes ändern?

85

Wie kann ich die Textfarbe von a ändern UISearchBar?

MrTourkos
quelle

Antworten:

105

Sie müssen auf das UITextFieldInnere 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
Christian
quelle
1
Ich habe meine Antwort bearbeitet. Sie können auf das Feld zugreifen, indem Sie valueforkey ("searchField") verwenden
Christian
6
Es ist keine private API, aber es ist sehr zerbrechlich und kann bei jedem iOS-Update kaputt gehen. Sie sollten solche Dinge niemals im Produktionscode verwenden
Lope
2
@Christian - Es spielt keine Rolle, wann die ursprüngliche Antwort veröffentlicht wurde, sie basiert immer noch auf der privaten API. Wenn es öffentlich wäre, müssten Sie nicht searchFieldüber KVC zugreifen .
Greg Brown
1
Downvote. Siehe @ juanjos Antwort und meinen Kommentar für einen viel robusteren Ansatz, der von Apple genehmigt wurde und weitaus weniger wahrscheinlich bricht.
RobP
1
Verwenden Sie diese Antwort nicht, Sie greifen auf private APIs zu und Ihre App wird möglicherweise abgelehnt.
Aryaxt
62

Wenn Sie die Textfarbe für UISearchBar im Storyboard (ohne Code) festlegen möchten, ist dies ebenfalls einfach (im Identitätsinspektor). Hier ist ein roter Text für die Suchleiste.

Geben Sie hier die Bildbeschreibung ein

unterbrechen
quelle
2
Es ist besser, weniger Code für Ansichtselemente zu haben. Vielen Dank.
NRR
Perfekte Lösung!
Mona
49

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]
chronikum
quelle
Ich arbeite für mich.
Surjeet Rajput
und es ändert die Farbe für jede Suchleiste im Modul?
Zaporozhchenko Oleksandr
47

Wenn Sie es nur auf einem dunklen Hintergrund lesbar machen müssen, können Sie den barStyle ändern. Durch Folgendes werden Text und Schaltflächen in der Suchleiste weiß:

searchController.searchBar.barStyle = .black
Speck
quelle
@ Bacon, es hat auch geholfen! Danke
Goppinath
32
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
    }
}
Adam Waite
quelle
Wie Sie Lösung. Vielen Dank.
Bagusflyer
Sie können auch "searchField.backgroundColor" hinzufügen, um die Hintergrundfarbe des Textfelds unabhängig von der Balkentönung zu steuern.
Sherwin Zadeh
13

Dies funktioniert bei mir unter iOS 11, Xcode 9:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue

Ich schreibe es in die, AppDelegateaber ich denke, es funktioniert, wenn Sie es auch woanders platzieren.

Juanjo
quelle
3
Dies ist ein viel robusterer Ansatz als der Schlüsselwert-Unsinn in der akzeptierten Antwort und anderen Antworten. Allerdings hat Apple in ihrer Weisheit die API, die Sie hier verwenden, abgelehnt und bietet eine neue Version für iOS 9.0 und höher an, wie [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];folgt : Dies ist natürlich Objective-C, mit offensichtlicher Übersetzung in Swift unter Verwendung vonappearance(whenContainedInInstancesOf:)
RobP
2
Scheint für mich in Xcode 10, iOS 12, auf einem tatsächlichen Gerät nicht zu funktionieren.
Oded
10

Ich denke, der bequemste Weg ist, eine textColorImmobilie 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
Tal Zion
quelle
Ich arbeite nicht für mich. Wann legen Sie die Eigenschaft textcolor fest?
Kingalione
1
@Kingalione können Sie dies in 'viewDidLoad ()'
Tal Zion
Ja, ich wollte die Textfarbe des Placholders ändern. Jetzt habe ich die Lösungen gefunden.
Trotzdem
10

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")
    }
}
Saren Inden
quelle
Schließlich! Wir können direkt auf das Textfeld zugreifen. Danke, Saren.
Mark Moeykens
4

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.

Endlosschleife
quelle
3

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
    }
}
Omar Albeik
quelle
3

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 UISearchBarKlasse mit dem Namen " SearchBar : UISearchBar, UISearchBarDelegate Dies SearchBar" enthält die UISearchBarDelegateMethoden, die ich verarbeiten möchte, und deren delegateSatz.

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 UITextFieldDankeschön zugreifen UISearchBar.searchTextField, das vom Typ ist UISearchTextField, von dem es erbt UITextField.

Da ich meine Hierarchie kenne, weiß ich, textFielddass 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, SearchBarindem 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!).

Bryan ORTIZ
quelle
2

// Versuch es mit diesem Kerl

yourSearchbar.searchTextField.textColor = .white
Nrv
quelle
1

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;
        }
    }
}
t9mike
quelle
1

(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 }
    }
}
David Steppenbeck
quelle
für iOS 13 return subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
Taras
0

In meiner Situation ist die Lösung

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
poGUIst
quelle
0

Obj-C

UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"];
textField.textColor = [UIColor redColor];

Swift 4.x.

let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red
Argus
quelle
0

Swift 5.2 & iOS 13.3.1: -

Es funktioniert gut.

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Dinesh Kumar
quelle
0

Swift 5:

searchBar[keyPath: \.searchTextField].textColor = UIColor(...)

ramzesenok
quelle
-1

Swift 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
Blyscuit
quelle