webentwicklung-frage-antwort-db.com.de

Wie kann ich die Suchtextfarbe der UISearchBar ändern?

Wie kann ich die Textfarbe einer UISearchBar ändern?

52
MrTourkos

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
77
Christian

Wenn Sie die Textfarbe für UISearchBar im Storyboard (ohne Code) festlegen möchten, können Sie dies auch problemlos tun (im Identity Inspector). Hier ist ein roter Text für die Suchleiste.

 enter image description here

44
interrupt

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]
30
chronikum

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
29
Bacon
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
    }
}
27
Adam Waite

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
9
Tal Zion

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.

7
juanjo

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

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")
    }
}
0
Saren Inden

(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]];
0
poGUIst

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;
        }
    }
}
0
t9mike