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.
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.
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]
L'espace réservé:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
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
}
Tiré de ici .
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.
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
}
}
Déplacer l'appel vers setDefaultSearchBar
dans viewDidAppear
devrait résoudre ce problème.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
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
}
}
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