large - UISearchController iOS 11 Personalización
uisearchbar swift 4 (9)
Acabo de descubrir cómo configurarlos: (con ayuda de Brandon y Krunal, ¡gracias!)
El texto "Cancelar":
searchController.searchBar.tintColor = .white
El ícono de búsqueda:
searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.search, state: .normal)
El ícono claro:
searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.clear, state: .normal)
El texto de búsqueda:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
El marcador de posición:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
El fondo blanco:
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
}
Tomado de here .
Había estado usando el siguiente código antes de iOS 11 para personalizar la apariencia de la
UISearchController
búsqueda
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
}
}
Sin embargo, después de actualizar a iOS 11 y agregar
UISearchController
como parte del elemento de
navigationItem
no se muestra
ninguna
personalización (excepto la apariencia del teclado que demuestra que se ha llamado mi código).
¿Es esto un error o lo he implementado incorrectamente?
EDITAR: se adjuntan dos capturas de pantalla de dispositivos con iOS 10 (primero) e iOS 11
EDITAR 2:
Gran parte de la atención sobre esta pregunta hasta ahora se centra en el color del texto de
UISearchBar
.
Estoy mirando más que esto: el color de fondo, el color del tinte, el indicador de búsqueda y los colores claros del botón, etc., no se pueden personalizar en un dispositivo con iOS 11 a pesar de ser perfectamente capaz de hacerlo en iOS 10.
Mover la llamada a
setDefaultSearchBar
en
viewDidAppear
debería solucionar esto.
Necesita encontrar el
UISearchBar
subyacente de
UITextField
y cambiar su color de texto.
Tenga en cuenta que esto solo tendrá efecto cuando el controlador de búsqueda se presente (
UISearchControllerDelegate.willPresentSearchController
) o se presente.
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
}
}
Para configurar correctamente el texto escrito en la barra de búsqueda en blanco (cuando se usa un color de campo oscuro):
searchController.searchBar.barStyle = .black
Para establecer el color de fondo del campo de texto
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;
}
}
}
Sin embargo, usando algo como
textfield.textColor = UIColor.blue
en lo anterior no parece funcionar.
Pruébelo:
searchController.<YOUR SEARCHBAR>.barStyle = .blackOpaque
lugar de
self.searchBarStyle = .minimal
.
Así:
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 necesita cambiar el color de fondo del campo de texto en la barra de búsqueda, vea mi respuesta aquí: https://.com/a/46315974/1109892
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]