iOS 11 personaliza la barra de búsqueda en la barra de navegación

Quiero cambiar el color del texto y el icono en la barra de búsqueda de iOS 11 cuando está incrustado en la barra de navegación. Así que el texto del marcador de posición, el texto de búsqueda y el ícono de búsqueda.

enter image description here

if #available(iOS 11.0, *) { navigationController?.navigationBar.prefersLargeTitles = false let searchController = UISearchController(searchResultsController: nil) navigationItem.searchController = searchController navigationItem.hidesSearchBarWhenScrolling = false searchController.searchBar.placeholder = "Suchen" searchController.searchBar.tintColor = .white } 

Como puede ver en la imagen, el texto es gris sobre un fondo azul profundo, que se ve feo. Quiero que el texto y el icono sean al menos blancos. (Cambiar el color de fondo azul tampoco funciona realmente bien, ver mi otra pregunta )

Lo único que funciona es cambiar el color del cursor parpadeante y el botón “cancelar”, que se realiza con la propiedad .tintColor.

Parece que las soluciones que parecen funcionar en iOS 10 y versiones posteriores ya no funcionan en iOS 11, así que publique solo soluciones que sepa que funciona en iOS 11. Gracias.

Tal vez me pierdo el punto acerca de este “estilo automático” en iOS 11. Se agradece cualquier ayuda.

Acabo de descubrir cómo establecer también el rest de ellos: (con un poco de ayuda de Brandon, ¡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] 

Gracias por la ayuda @Brandon!

enter image description here

El marcador de posición:

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

enter image description here

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 } 

enter image description here

Tomado de aquí .

Poner

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

y

UISearchBar.appearance().tintColor = UIColor.white en AppDelegate .

Alternativamente, [UIViewController viewDidLoad:] ambos en [UIViewController viewDidLoad:]

Establecer el color del texto de búsqueda

 (UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white] 

Establecer color de marcador de posición de búsqueda

 (UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).attributedPlaceholder = [NSForegroundColorAttributeName: UIColor.white] 

Además de la respuesta de Darko. En mi caso, necesito obtener el color del campo de texto de búsqueda blanco puro. También necesito una borderline y cornerRadius personalizadas. Entonces, si simplemente configuro el color de fondo en blanco, establezco un radio de esquina personalizado y una línea de borde personalizada, tengo algo como esto. Mira este feo HighLight gris cuando tocas en el campo de texto

El problema es que la barra de búsqueda tiene algunas subvistas y las acabo de eliminar. Aquí está mi código:

 @interface YourViewController ()  // your properties @property (nonatomic,strong) UISearchController *searchController; @property (nonatomic,strong) UISearchBar *searchBar; @end - (void)viewDidLoad { [super viewDidLoad]; _searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController]; _searchController.delegate = self; _searchController.searchBar.delegate = self; _searchBar = self.searchController.searchBar; if (@available(iOS 11.0, *)) { UITextField *searchTextField = [_searchBar valueForKey:@"searchField"]; if (searchTextField != nil) { searchTextField.layer.cornerRadius = 4.f; searchTextField.layer.borderWidth = 1.f; searchTextField.clipsToBounds = YES; for (UIView *subView in searchTextField.subviews) { [subView removeFromSuperview]; } } // Color for "Cancel" button _searchBar.tintColor = [UIColor blackColor]; // Add searchController to navgationBar _navigationItem.searchController = _searchController; // Hide searchBar when scroll _navigationItem.hidesSearchBarWhenScrolling = YES; } } 

Ahora tengo una barra de búsqueda con fondo blanco puro, esquina personalizadaRadius, ancho de borde personalizado. También desactivé el resaltado gris cuando toque. Edición de campo de búsqueda Resignar al primer respondedor

Este código cambia el color de fondo del campo de texto

Swift 4

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { //background color of text field UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan } 

editado: muestra de un UISearchBar en cyan

muestra