web-dev-qa-db-fra.com

couleur d'arrière-plan iOS 11 UISearchBar

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.

  • Est-ce que quelqu'un sait comment en faitajuster la couleur de fond d'une barre de recherche dans iOS 11?

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

8
Will Von Ullrich

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:

enter image description here

4
Krunal

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

 example used to change the background to cyan color

4
Maruta
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

Hiérarchie des vues d'exécution

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 UISearchBar

Nous 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.

Vue d'ensemble de UISearchBar

barTintColor pour UISearchBarBackground

Nous 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.

barTintColor de UISearchBar

searchField?.backgroundColor pour UITextField

Nous 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.

UITextField de UISearchBar

2
user5533269