web-dev-qa-db-fra.com

Comment modifier la couleur du texte de recherche UISearchBar?

Comment puis-je changer la couleur du texte d'un UISearchBar?

52
MrTourkos

Vous devez accéder à la UITextField dans la barre UISearchBar. Vous pouvez le faire en utilisant valueForKey("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
77
Christian

Si vous souhaitez définir la couleur du texte pour UISearchBar dans le storyboard (sans code), vous pouvez également le faire facilement (dans l'inspecteur d'identité). Voici un texte rouge pour la barre de recherche.

 enter image description here

44
interrupt

Travailler dans Swift 4 pour moi:

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

Si vous devez uniquement le rendre lisible sur un fond sombre, vous pouvez modifier le barStyle. Ce qui suit rend le texte et les boutons dans la barre de recherche blancs:

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

Je pense que le moyen le plus pratique est de définir une propriété textColor dans 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
               }
           }
       }
   }

Utilisation

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
         }
     }
 }
} 

Vous l'utiliseriez comme:

searchBar.textColor = UIColor.blueColor() // Your color
9
Tal Zion

Cela fonctionne pour moi sur iOS 11, Xcode 9:

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

Je l’écris dans la AppDelegate mais je suppose que cela fonctionne si vous le mettez aussi ailleurs.

7
juanjo

Vous pouvez le faire en accédant à UITextField dans la barre de recherche Vous pourrez alors modifier sa couleur d'arrière-plan, sa couleur de texte et toutes ses autres propriétés UITextField.

ajoutez l'extension suivante pour accéder à textField

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

Depuis Xcode 11 et iOS 13, il est devenu possible d’accéder directement au champ de texte:

searchBar.searchTextField

Vous pouvez écrire du code pour le rendre toujours accessible comme ceci.

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
    }
}

Vous pouvez également le rendre non facultatif avec les erreurs fatales, ce code est testé depuis iOS 7 jusqu'à iOS 13b6. Mais je voudrais juste aller pour la version optionnelle.

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

(Cette solution a uniquement été testée pour Xcode 10 et iOS 12.) Ajoutez une extension pour accéder au champ de texte de la barre de recherche:

extension UISearchBar {
    var textField: UITextField? {
        return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
    }
}

Utilisez ensuite cette propriété pour définir la couleur du texte du champ de texte dans la barre de recherche:

let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
0

Dans ma situation, la solution est

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

Voici une version Xamarin.iOS C # de l'approche "find the UITextField". Il ne plantera pas si UITextField disparaît dans la hiérarchie future des vues iOS.

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