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