how example custom bar ios swift uisearchbar

ios - example - ¿Cómo puedo cambiar el color del texto de búsqueda UISearchBar?



uisearchbardelegate (14)

(Esta solución solo se probó para Xcode 10 y iOS 12.) Agregue una extensión para acceder al campo de texto de la barra de búsqueda:

var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField); if (tf != null) (tf as UITextField).TextColor = UIColor.White; public static IEnumerable<UIView> AllSubViews(this UIView view) { foreach (var v in view.Subviews) { yield return v; foreach (var sv in v.AllSubViews()) { yield return sv; } } }

Luego use esa propiedad para establecer el color del texto del campo de texto en su barra de búsqueda:

searchBar.searchTextField

// EDITAR

El código anterior no funciona para iOS 13. Una mejor manera de manejar esto es usar:

extension UISearchBar { public var textField: UITextField? { guard let firstSubview = subviews.first else { assertionFailure("Could not find text field") return nil } for view in firstSubview.subviews { if #available(iOS 13.0, *) { return searchTextField } else { if let textView = view as? UITextField { return textView } } } assertionFailure("Could not find text field") return nil } }

¿Cómo puedo cambiar el color del texto de una UISearchBar ?


Aquí hay una versión Xamarin.iOS C # del enfoque "encontrar el UITextField". No se bloqueará si el UITextField desaparece en la futura jerarquía de vistas de iOS.

var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField); if (tf != null) (tf as UITextField).TextColor = UIColor.White; public static IEnumerable<UIView> AllSubViews(this UIView view) { foreach (var v in view.Subviews) { yield return v; foreach (var sv in v.AllSubViews()) { yield return sv; } } }


Desde Xcode 11 y iOS 13 se ha hecho posible acceder directamente al campo de texto:

extension UISearchBar { /// Return text field inside a search bar var textField: UITextField? { let subViews = subviews.flatMap { $0.subviews } guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else { return nil } return textField } }

Podrías escribir algún código para que siempre sea accesible de esta manera.

extension UISearchBar { var textField: UITextField? { return subviews.first?.subviews.compactMap { $0 as? UITextField }.first } }

También podría hacerlo no opcional con errores fatales, este código se prueba desde iOS 7 hasta iOS 13GM. Pero simplemente iría por la versión opcional.

let searchBar = UISearchBar() searchBar.textField?.textColor = UIColor.white // or whichever color you want


En mi situación la solución es

extension UISearchBar { public var textField: UITextField { guard let firstSubview = subviews.first else { fatalError("Could not find text field") } for view in firstSubview.subviews { if #available(iOS 13.0, *) { return searchTextField } else { if let textView = view as? UITextField { return textView } } } fatalError("Could not find text field") } }


Esto funciona para mí en iOS 11, Xcode 9:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue

Lo escribo en AppDelegate pero supongo que funciona si lo pones en otro lugar también.


La forma más conveniente, creo, es establecer una propiedad UISearchBar en UISearchBar .

Swift 3.0

extension UISearchBar { var textColor:UIColor? { get { if let textField = self.value(forKey: "searchField") as? UITextField { return textField.textColor } else { return nil } } set (newValue) { if let textField = self.value(forKey: "searchField") as? UITextField { textField.textColor = newValue } } } }

Uso

searchBar.textColor = UIColor.blue // Your color

Swift 2.3

extension UISearchBar { var textColor:UIColor? { get { if let textField = self.valueForKey("searchField") as? UITextField { return textField.textColor } else { return nil } } set (newValue) { if let textField = self.valueForKey("searchField") as? UITextField { textField.textColor = newValue } } } }

Lo usarías como:

searchBar.textColor = UIColor.blueColor() // Your color


Probé algunas de las soluciones escritas anteriormente pero no funcionaron (supongo que ya no).

Si solo quieres manejar iOS 13:

mySearchBar.searchTextField.textColor = .red

Pero si también quieres manejar iOS más antiguo, así es como lo hice:

Cree una clase UISearchBar personalizada, llamada SearchBar : UISearchBar, UISearchBarDelegate Esta SearchBar tendrá los métodos UISearchBarDelegate que quiero manejar y su conjunto de delegate .

Y agrego a la clase:

var textField: UITextField? { if #available(iOS 13.0, *) { return self.searchTextField } return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField }

Breve explicación:

Con iOS13 ahora, puede acceder al UITextField gracias a UISearchBar.searchTextField , que es del tipo UISearchTextField , que hereda de UITextField .

Como conozco mi jerarquía, sé que mi textField no será nill para las versiones anteriores, por lo que en ambos casos, obtengo un campo de texto que puedo personalizar fácilmente, trabajando en todas las versiones, de la 9 a la 13 de hoy.

Aquí está el código completo necesario para que funcione:

class SearchBar: UISearchBar, UISearchBarDelegate { var textField: UITextField? { if #available(iOS 13.0, *) { return self.searchTextField } return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField } override func awakeFromNib() { super.awakeFromNib() delegate = self if let textField = textField { textField.textColor = .red textField.clearButtonMode = .whileEditing textField.returnKeyType = .search } } }

También puede configurar alguna personalización en SearchBar agregando esto en:

let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self]) searchBar.backgroundImage = UIImage() searchBar.isTranslucent = false searchBar.returnKeyType = .search

Luego lo configura en el XIB / Storyboard y lo maneja como si fuera una simple UISearchBar (¡si no olvidara a los delegados!).


Puede hacerlo accediendo a UITextField dentro de la barra de búsqueda, luego puede cambiar su color de fondo, color de texto y todas las demás propiedades de UITextField

agregue la siguiente extensión para acceder al campo de texto

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]]; [appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];


Si desea establecer el color del texto para UISearchBar en el guión gráfico (sin código), también es fácil hacerlo (en el inspector de identidad). Aquí hay un texto rojo para la barra de búsqueda.


Si solo necesita que sea legible sobre un fondo oscuro, puede cambiar el estilo de barra. Lo siguiente hace que el texto y los botones de la barra de búsqueda sean blancos:

searchController.searchBar.barStyle = .black


Trabajando en Swift 4 para mí:

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

Swift 4.2, IOS 12:

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


UITextField acceder al UITextField dentro de UISearchBar. Puede hacerlo utilizando valueForKey("searchField")

var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField textFieldInsideSearchBar?.textColor = yourcolor

Actualización de Swift 3

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


Obj-C

UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"]; textField.textColor = [UIColor redColor];

Swift 4.x

let textField = yourSearchbar.value(forKey: "searchField") as? UITextField textField?.textColor = UIColor.red


public extension UISearchBar { public func setTextColor(color: UIColor) { let svs = subviews.flatMap { $0.subviews } guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return } tf.textColor = color } }