web-dev-qa-db-fra.com

Personnalisation d'UISearchController iOS 11

J'utilisais le code suivant avant iOS 11 pour personnaliser l'apparence de la barre de recherche UISearchController:

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, après avoir mis à jour iOS 11 et ajouté UISearchController à la personnalisation navigationItem, n’importe laquelle (à l’exception du clavier). l'apparence prouvant que mon code a été appelé) ne s'affiche pas. Est-ce un bogue ou est-ce que je l'ai mal implémenté?

EDIT: Vous trouverez ci-joint deux captures d'écran d'appareils exécutant iOS 10 (premier) et iOS 11.

enter image description here

enter image description here

EDIT 2: Jusqu'à présent, une grande partie de l'attention portée à cette question est concentrée sur la couleur du texte du UISearchBar. Je regarde plus que cela - la couleur de fond, la couleur de teinte, l'indicateur de recherche et les couleurs des boutons clairs, etc. tous ne peuvent pas être personnalisés sur un appareil exécutant iOS 11 bien qu’il soit parfaitement capable de le faire sous iOS 10.

51
Alexander MacLeod

Je viens de découvrir comment les configurer: (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 ici .

66
Darko

Pour définir correctement le texte saisi dans la barre de recherche sur blanc, utilisez (en cas d'utilisation d'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 ce qui précède ne semble pas fonctionner.

9
Zyntx

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

searchController.searchBar.barStyle = UIBarStyleBlack;

image 1

5
Eddie Hsu

Vous devez trouver le UISearchBar sous-jacent de UITextField et changer la couleur de son texte.

Notez que cela 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
    }
}
4
Jonny

Déplacer l'appel vers setDefaultSearchBar dans viewDidAppear devrait résoudre ce problème.

4
highmaintenance
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
3
Isa M

Essayez-le: searchController.<YOUR SEARCHBAR>.barStyle = .blackOpaque au lieu de self.searchBarStyle = .minimal.

Ainsi:

var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
//Add this line below
searchController.searchBar.barStyle = .blackOpaque
searchController.searchResultsUpdater = self

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

extension UISearchBar {
    func setDefaultSearchBar() {
        self.tintColor = UIColor.blue
        //Delete this line below
        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
    }
}
1
Hoff Silva

Si vous devez modifier la couleur d'arrière-plan du champ textField dans la barre de recherche, consultez ma réponse ici: https://stackoverflow.com/a/46315974/1109892

1
Adam Studenic

Vous devez accéder à UITextField à l'intérieur de UISearchBar. Vous pouvez le faire en utilisant

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

OR

enter image description here

0
yogesh wadhwa