58 votes

Personnalisation de UISearchController pour iOS 11

Avant iOS 11, j'utilisais le code suivant pour personnaliser l'apparence de l'icône UISearchController barre de recherche :

var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
searchController.searchResultsUpdater = self

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
} else {
    tableView.tableHeaderView = searchController.searchBar
}

extension UISearchBar {
    func setDefaultSearchBar() {
        self.tintColor = UIColor.blue
        self.searchBarStyle = .minimal
        self.backgroundImage = UIImage(color: UIColor.clear)
        let searchBarTextField = self.value(forKey: "searchField") as! UITextField
        searchBarTextField.textColor = UIColor.white
        searchBarTextField.tintColor = UIColor.blue
        searchBarTextField = .dark
    }
}

Cependant, l'apparence de la barre de recherche ne se met pas à jour lorsqu'on exécute le même code sur iOS 11.

iOS 10 :

enter image description here

iOS 11 :

enter image description here

Jusqu'à présent, une grande partie de l'attention portée à cette question s'est concentrée sur la couleur du texte de la barre de recherche. Je cherche plus que cela - la couleur de l'arrière-plan, la couleur de la teinte, l'indicateur de recherche, la couleur du bouton d'effacement, etc.

0 votes

Bien demandé, mais je ne peux pas être surpris si, lorsque vous adoptez la notion de champ de recherche géré par la barre de navigation, le runtime lui impose son propre look. Il se peut que vous puissiez imposer vos personnalisations en les retardant jusqu'à ce que le runtime ait eu la possibilité de configurer la barre de recherche elle-même, mais ce n'est qu'une supposition et je ne serais pas surpris que cela ne fonctionne pas non plus.

0 votes

Vous pouvez réaliser ce type de personnalisation en utilisant des mandataires d'apparence. Cependant, d'après mon expérience, c'est un bogue : la barre ressemble exactement à ce que je veux au début, mais lorsqu'un autre contrôleur de vue la cache, elle perd les coins arrondis.

0 votes

Essayez d'appliquer l'apparence de la police au champ de recherche (couleur de police blanche).

78voto

Darko Points 1025

Je viens de découvrir comment les régler : (avec l'aide de Brandon et Krunal, merci !)

Le texte "Annuler" :

searchController.searchBar.tintColor = .white

L'icône de recherche :

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.search, state: .normal)

L'icône claire :

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.clear, state: .normal)

Le texte de recherche :

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]

enter image description here

L'espace réservé :

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])

enter image description here

Le fond blanc :

if #available(iOS 11.0, *) {
    let sc = UISearchController(searchResultsController: nil)
    sc.delegate = self
    let scb = sc.searchBar
    scb.tintColor = UIColor.white
    scb.barTintColor = UIColor.white

    if let textfield = scb.value(forKey: "searchField") as? UITextField {
        textfield.textColor = UIColor.blue
        if let backgroundview = textfield.subviews.first {

            // Background color
            backgroundview.backgroundColor = UIColor.white

            // Rounded corner
            backgroundview.layer.cornerRadius = 10;
            backgroundview.clipsToBounds = true;
        }
    }

    if let navigationbar = self.navigationController?.navigationBar {
        navigationbar.barTintColor = UIColor.blue
    }
    navigationItem.searchController = sc
    navigationItem.hidesSearchBarWhenScrolling = false
}

enter image description here

Tiré de aquí .

4 votes

Encore une fois, cette réponse n'est pas très bonne avec les couleurs. La couleur de fond de la barre de navigation semble toujours plus foncée que ce que vous spécifiez.

0 votes

Bonjour @AlexanderMacLeod , avez-vous résolu le problème ?

1 votes

Il faut savoir que, comme pour tout le développement d'iOS, l'utilisation d'une value:forKey: est considéré comme accédant aux eaux privées de l'API et serait très probablement contre les t&c d'Apple.

10voto

Zyntx Points 324

Pour que le texte tapé dans la barre de recherche soit correctement mis en blanc (lorsque vous utilisez une couleur de champ sombre) :

searchController.searchBar.barStyle = .black

Pour définir la couleur d'arrière-plan du champ de texte

if #available(iOS 11.0, *) {

        if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
            if let backgroundview = textfield.subviews.first {

                // Background color
                backgroundview.backgroundColor = UIColor.white

                // Rounded corner
                backgroundview.layer.cornerRadius = 10;
                backgroundview.clipsToBounds = true;
            }
        }
    }

Cependant, en utilisant quelque chose comme

textfield.textColor = UIColor.blue

dans l'exemple ci-dessus ne semble pas fonctionner.

6voto

Eddie Hsu Points 41

Essayez de définir le style de la barre de recherche.

searchController.searchBar.barStyle = UIBarStyleBlack;

image 1

0 votes

Excellent ! Cela fait passer la couleur du texte du noir au blanc.

5voto

Andy Points 1448

Déplacer l'appel à setDefaultSearchBar en viewDidAppear devrait régler ce problème.

2 votes

Cette réponse fonctionne avec certaines propriétés comme la couleur du texte mais pas avec backgroundImage. Elle laisse également un changement d'image peu esthétique lorsque l'on passe d'une vue à l'autre.

0 votes

@AlexanderMacLeod dommage mais je suppose que vous avez raison, cela ne fonctionnera pas pour tous les accessoires :(

4voto

Jonny Points 1025

Vous devez trouver le UISearchBar de l'entreprise UITextField et changez la couleur de son texte.

Notez que ceci n'a d'effet que lorsque le contrôleur de recherche va présenter ( UISearchControllerDelegate.willPresentSearchController ) ou présenté.

class ViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // setup your search controller...

        // set search controller's delegate
        navigationItem.searchController?.delegate = self
    }
}

extension ViewController : UISearchControllerDelegate {

    func willPresentSearchController(_ searchController: UISearchController) {
        // update text color
        searchController.searchBar.textField?.textColor = .white
    }
}

extension UISearchBar {

    var textField: UITextField? {
        for subview in subviews.first?.subviews ?? [] {
            if let textField = subview as? UITextField {
                return textField
            }
        }
        return nil
    }
}

0 votes

Merci, vous avez sauvé ma journée. C'est vraiment un défi de personnaliser UISearchBar dans IOS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X