tutorial searchcontroller large example bar ios swift uisearchcontroller ios11

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.


Debe acceder al UITextField dentro de UISearchBar. Puedes hacerlo usando

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

O


Intente configurar el estilo de barra de la barra de búsqueda.

searchController.searchBar.barStyle = UIBarStyleBlack;


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]