Je comprends que cette question a été posée à beaucoup de plusieursfois sur SO. Cependant, comme Apple le fait mieux, avec la sortie de iOS 11, ils semblent avoir apporté un changement apparemment inutile à la UISearchBar
, spécifiquement c'est la hiérarchie de vue.
En outre, le "champ de texte" d'une barre de recherche n'est plus accessible dans les vues secondaires de la barre de recherche, ce qui entraîne toutesdes solutions précédentes) "d'accès" et modifie la couleur d'arrière-plan du champ de texte, ou toute propriété de le champ de texte d'ailleurs.
FYI:Je parle spécifiquement de la couleur derrière le texte ... qui, à partir de 11 heures, devient blanc par défaut, sauf si vous spécifiez que le style de la barre de recherche est minimal.
UPDATE 1:
Depuis que j'ai posté cette question, je n'ai toujours pas trouvé de solution valable ou réelle any = solution réelleà ce problème. Le plus près de moi semble être de plonger profondément dans l'apparence, par exemple, les propriétés
[[UISearchBar class] appearanceWhenContainedInInstancesOfClasses:(nonnull NSArray<Class<UIAppearanceContainer>> *)]
de la UISearchBar
. Jouer avec la UITextField
trouvée via des méthodes telles que:
if ([view isKindOfClass:[UITextField class]]) {
return (UITextField*)view;
}
UITextField *searchTextField;
for (UIView *subview in view.subviews) {
searchTextField = [self searchViewForTextFieldBg:subview];
if (searchTextField) {
break;
}
}
return searchTextField;
vous pouvez commencer à dessiner une nouvellevue d'arrière-plan à placer derrière la vue. Toutefois, les problèmes que je trouvais trop fastidieux à poursuivre étaient de dessiner une vue avec le cadre/limites corrects pour imiter exactement l'arrière-plan d'origine.
Espérons que quelqu'un puisse trouver la solution actuelle à ce problème. Belle Mlle Apple ...
Je pense que vous cherchez peut-être cela, non? Mais je l'ai dans Swift :(
@IBOutlet weak var sbSearchBar: UISearchBar!
if let textfield = sbSearchBar.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
textfield.backgroundColor = UIColor.yellow
}
Voici le résultat:
Ce code modifie la couleur d'arrière-plan du champ de texte.
Swift 4
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//background color of text field
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan
}
C'est le résultat
let searchBar = UISearchBar(frame: CGRect())
let searchField: UITextField? = searchBar.value(forKey: "searchField") as? UITextField
let searchBarBackground: UIView? = searchBar.value(forKey: "background") as? UIView
// searchBarBackground?.removeFromSuperview()
if searchField != nil {
var frame = searchField?.frame
frame?.size.height = 30
searchField?.frame = frame!
searchField?.backgroundColor = .yellow
}
searchBar.barTintColor = .red
searchBar.delegate = self
searchBar.backgroundColor = .green
Si nous définissons les couleurs d'arrière-plan pour UISearchBar avec le code ci-dessus, nous verrons les sous-vues colorées comme les images suivantes (cliquez sur les liens pour voir) .
backgroundColor
pour Superview des sous-vues UISearchBarNous pouvons voir que le nom de classe de la vue verte est UISearchBar dans l'inspecteur d'objets.
Donc, si nous utilisons searchBar.backgroundColor = .green
, nous allons définir la couleur de fond backgroundColor de Superview verte. Par conséquent, la propriété d'instance UISearchBar backgroundColor
définira la couleur d'arrière-plan de la vue supérieure.
barTintColor
pour UISearchBarBackgroundNous pouvons voir que le nom de classe de la vue rouge est UISearchBarBackground dans l'inspecteur d'objets.
Cependant, il n'y a pas de méthode directe pour accéder à la vue, nous pouvons utiliser KVCsearchBar.value(forKey: "background") as? UIView
pour obtenir searchBarBackground.
Si nous utilisons searchBar.barTintColor = .red
, nous définirons la couleur de fond backgroundColor de la vue de UISearchBarBackground. Afin de supprimer deux bordures noires sur le calque des barres de teinte, nous devons supprimer l’arrière-plan de Superview.
searchField?.backgroundColor
pour UITextFieldNous pouvons voir que le nom de classe de la vue jaune est _UISearchBarSearchFieldBackgroundView (sous-vue de UISearchBarTextField) dans l'inspecteur d'objets.
Il n'y a pas de méthode directe pour accéder à searchField, identique à searchBarBackground. Nous pouvons également utiliser KVCsearchField: UITextField? = searchBar.value(forKey: "searchField") as? UITextField
pour obtenir searchField.
Si nous utilisons searchField?.backgroundColor = .yellow
, nous allons définir la couleur d'arrière-plan de UITextField en jaune. Par conséquent, si nous voulons définir la couleur d'arrière-plan du champ de texte, nous devons d'abord accéder à searchField avec KVC.