Comment puis-je changer la couleur du texte d'un UISearchBar
?
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
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]
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
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
}
}
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
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.
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
}
}
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")
}
}
(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
Dans ma situation, la solution est
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
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;
}
}
}