personalizar pantalla control centro bloqueo aparece ios swift uinavigationbar uisearchbar

pantalla - personalizar centro de control ios 11



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

Acabo de descubrir cómo configurar también el resto de ellos: (con la 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!

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 .

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. Por lo tanto, texto de marcador de posición, texto de búsqueda e icono de búsqueda

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 muy bien, vea 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.

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

Tal vez pierdo el punto sobre este "estilo automático" en iOS 11. Cualquier ayuda es apreciada.


Además de la respuesta de Darko. En mi caso, necesito obtener un color de campo de texto de búsqueda blanco puro. También necesito un borderLine y cornerRadius personalizados. Entonces, si solo configuro el color de fondo en blanco, establezco el radio de esquina personalizado y la línea de borde personalizada, tengo algo como esto.

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

@interface YourViewController () <UISearchBarDelegate, UISearchControllerDelegate> // 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 de radio personalizada, ancho de borde personalizado. También he desactivado el resaltado gris cuando toca.


Establecer color de 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]


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 una UISearchBar en cian


Intenté la solución Daroko, pero tuve un problema al cambiar el fondo a color blanco puro (era gris). Mi solución fue usar setSearchFieldBackgroundImage . Además, no quiero confiar en la estructura de Apple para obtener el UITextField

if #available(iOS 11.0, *) { let whiteImage = UIImage(color: UIColor.white, size: CGSize(width: searchController.searchBar.layer.frame.width, height: searchController.searchBar.layer.frame.height)) searchController.searchBar.setSearchFieldBackgroundImage(whiteImage, for: .normal) self.navigationItem.searchController = searchController self.navigationItem.hidesSearchBarWhenScrolling = true } public extension UIImage { public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) { let rect = CGRect(origin: .zero, size: size) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) color.setFill() UIRectFill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() guard let cgImage = image?.cgImage else { return nil } self.init(cgImage: cgImage) } }

Usé la extensión UIImage de: Crear UIImage con color sólido en Swift


Mis dos centavos para Swift 4.x, ligeramente limpiados.

Agregar controlador o delegado de aplicaciones:

appearance.backgroundColor = .green let myFont = UIFont.italicSystemFont(ofSize: 12) let attribs = [ NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue): myFont, NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.red ] appearance.defaultTextAttributes = attribs

en el controlador:

self.searchBar.barTintColor = .blue

Obtendrá fondo azul, fondo de barra de búsqueda verde, fuente cursiva roja:


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:]