UISearchController iOS 11 Personalización

Había estado usando el siguiente código anterior 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, al actualizar a iOS 11 y agregar el UISearchController como parte del elemento de navigationItem no se muestra ninguna personalización (excepto la apariencia del keyboard que demuestra que se ha llamado mi código). ¿Esto es un error o lo he implementado incorrectamente?

EDITAR: Adjunto hay dos capturas de pantalla de dispositivos con iOS 10 (primero) e iOS 11

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

EDIT 2: Gran parte de la atención en esta pregunta se centra hasta ahora en el color del text del UISearchBar . Estoy viendo más que esto: el color de background, el color de tinte, el indicador de búsqueda y los colors de los botones claros, etc., no pueden personalizarse en un dispositivo con iOS 11 a pesar de ser perfectamente capaces de hacerlo en iOS 10.

Acabo de descubrir cómo configurarlos: (con algo de ayuda de Brandon y Krunal, ¡gracias!)

El text "Cancelar":

 searchController.searchBar.tintColor = .white 

El icono de búsqueda:

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

El icono claro:

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

El text de búsqueda:

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

introduzca la descripción de la imagen aquí

El marcador de position:

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

introduzca la descripción de la imagen aquí

El background 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 } 

introduzca la descripción de la imagen aquí

Tomado de aqui

Mover la llamada a setDefaultSearchBar a viewDidAppear debería solucionar esto.

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

 searchController.searchBar.barStyle = UIBarStyleBlack; 

imagen 1

Tienes que acceder al UITextField dentro del UISearchBar. Puedes hacerlo usando

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

O

introduzca la descripción de la imagen aquí

Necesita encontrar UISearchBar subyacente UITextField y cambiar su color de text.

Tenga en count que esto solo tendrá efecto cuando el controller de búsqueda presentará ( UISearchControllerDelegate.willPresentSearchController ) o se presentará.

 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 } } 

Si necesita cambiar el color de background de textField en el searchBar, vea mi respuesta aquí: https://stackoverflow.com/a/46315974/1109892.