Comment puis-je changer la couleur du texte d'un UISearchBar
?
Réponses:
Vous devez accéder à l' UITextField
intérieur de UISearchBar. Vous pouvez le faire en utilisantvalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Mise à jour Swift 3
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
via KVC.
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]
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
}
}
Cela fonctionne pour moi sur iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Je l'écris dans le AppDelegate
mais je suppose que cela fonctionne si vous le mettez ailleurs aussi.
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
Il s'agit bien sûr d'Objective-C, avec une traduction évidente en Swift en utilisantappearance(whenContainedInInstancesOf:)
Le moyen le plus pratique à mon avis est de définir une textColor
propriété 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
}
}
}
}
Usage
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
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 toujours le rendre accessible comme ça.
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
}
}
Vous pouvez également le rendre non facultatif avec des erreurs fatales, ce code est testé depuis iOS 7 jusqu'à iOS 13GM. Mais j'opterais pour la version optionnelle.
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")
}
}
Essaye ça,
searchBar.searchTextField.textColor = .white
J'utilise ceci avec l'application ciblée sur iOS 11 et les versions ultérieures.
[Mise à jour] J'ai observé, l'application plante sur les anciennes versions (<iOS 13), mais le compilateur ne s'est jamais plaint de la vérification de la version, quelqu'un s'il vous plaît expliquer pourquoi cela s'est produit.
Vous pouvez le faire en accédant à UITextField dans la barre de recherche, puis vous pouvez modifier sa couleur d'arrière-plan, la couleur du texte et toutes les autres propriétés UITextField
ajoutez l'extension suivante pour accéder au 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
}
}
J'ai essayé quelques-unes des solutions écrites ci-dessus mais elles n'ont pas fonctionné (plus, je suppose).
Si vous souhaitez uniquement gérer iOS 13:
mySearchBar.searchTextField.textColor = .red
Mais si vous souhaitez également gérer un iOS plus ancien, voici ce que j'ai fait:
Créez une UISearchBar
classe personnalisée , appelée SearchBar : UISearchBar, UISearchBarDelegate
This SearchBar
aura les UISearchBarDelegate
méthodes que je veux gérer et son delegate
ensemble.
Et j'ajoute à la classe:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
Brève explication:
Avec iOS13 maintenant, vous pouvez accéder au UITextField
merci de UISearchBar.searchTextField
, qui est de type UISearchTextField
, qui hérite de UITextField
.
Puisque je connais ma hiérarchie, je sais que je textField
ne serai pas nill
pour les anciennes versions, donc dans les deux cas, j'obtiens un champ de texte que je peux facilement personnaliser, en travaillant sur toutes les versions, de 9 à 13 aujourd'hui.
Voici le code complet nécessaire pour le faire fonctionner:
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
}
}
}
Vous pouvez également définir une certaine personnalisation SearchBar
en ajoutant ceci sur le:
let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
searchBar.backgroundImage = UIImage()
searchBar.isTranslucent = false
searchBar.returnKeyType = .search
Ensuite, vous le définissez sur le XIB / Storyboard et vous le gérez comme s'il s'agissait d'un simple UISearchBar
(si vous n'avez pas oublié les délégués!).
(Cette solution n'a été testée que 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 votre barre de recherche:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
// ÉDITER
Le code ci-dessus ne fonctionne pas pour iOS 13. Une meilleure façon de gérer cela est d'utiliser:
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 et iOS 13.3.1: -
Ça fonctionne bien.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Voici une version Xamarin.iOS C # de l'approche «find the UITextField». Il ne plantera pas si UITextField disparaît dans la future hiérarchie de 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;
}
}
}
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)