¿Cómo puedo cambiar el color del texto de un UISearchBar
?
ios
swift
uisearchbar
MrTourkos
fuente
fuente
searchField
través de KVC.Si desea establecer el color del texto para UISearchBar en el guión gráfico (sin código), también es fácil de hacer (en el inspector de identidad). Aquí hay un texto rojo para la barra de búsqueda.
fuente
Trabajar 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]
fuente
Si solo necesita hacerlo legible sobre un fondo oscuro, puede cambiar barStyle. Lo siguiente hace que el texto y los botones de la barra de búsqueda sean blancos:
fuente
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 } }
fuente
Esto me funciona en iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Lo escribo en el
AppDelegate
pero supongo que funciona si lo pones en otro lugar también.fuente
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
esto es, por supuesto, Objective-C, con una traducción obvia a Swift usandoappearance(whenContainedInInstancesOf:)
Creo que la forma más conveniente es instalar una
textColor
propiedadUISearchBar
.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
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
fuente
Desde Xcode 11 e iOS 13, es posible acceder al campo de texto directamente:
Podrías escribir algún código para que siempre sea accesible así.
extension UISearchBar { public var textField: UITextField? { if #available(iOS 13.0, *) { return searchTextField } guard let firstSubview = subviews.first else { assertionFailure("Could not find text field") return nil } for view in firstSubview.subviews { if let textView = view as? UITextField { return textView } } assertionFailure("Could not find text field") return nil } }
También puede hacer que no sea opcional con errores fatales, este código se prueba desde iOS 7 hasta iOS 13GM. Pero solo optaría por la versión opcional.
extension UISearchBar { public var textField: UITextField { if #available(iOS 13.0, *) { return searchTextField } guard let firstSubview = subviews.first else { fatalError("Could not find text field") } for view in firstSubview.subviews { if let textView = view as? UITextField { return textView } } fatalError("Could not find text field") } }
fuente
Prueba esto,
Estoy usando esto con la aplicación orientada a iOS 11 en adelante.
[Actualización] Observé, la aplicación se bloquea en versiones anteriores (<iOS 13), pero el compilador nunca se quejó de la verificación de la versión, alguien explique por qué sucedió esto.
fuente
Puede hacer esto 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
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 } }
fuente
Probé algunas de las soluciones escritas anteriormente pero no funcionaron (supongo que ya).
Si solo desea manejar iOS 13:
mySearchBar.searchTextField.textColor = .red
Pero si también quieres manejar iOS más antiguo, esta es la forma en que lo hice:
Cree una
UISearchBar
clase personalizada , llamadaSearchBar : UISearchBar, UISearchBarDelegate
ThisSearchBar
tendrá losUISearchBarDelegate
métodos que quiero manejar y sudelegate
conjunto.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
agradecimiento aUISearchBar.searchTextField
, que es de tipoUISearchTextField
, que hereda deUITextField
.Como conozco mi jerarquía, sé
textField
que no seránill
para versiones anteriores, por lo que, en ambos casos, obtengo un campo de texto que puedo personalizar fácilmente, trabajando en cada versión, de 9 a 13 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 algo de personalización
SearchBar
agregando esto en:let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self]) searchBar.backgroundImage = UIImage() searchBar.isTranslucent = false searchBar.returnKeyType = .search
Luego lo configuras en el XIB / Storyboard y lo manejas como si fuera simple
UISearchBar
(¡si no te olvidas de los delegados!).fuente
(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:
extension UISearchBar { var textField: UITextField? { return subviews.first?.subviews.compactMap { $0 as? UITextField }.first } }
Luego use esa propiedad para establecer el color del texto del campo de texto en su barra de búsqueda:
let searchBar = UISearchBar() searchBar.textField?.textColor = UIColor.white // or whichever color you want
// EDITAR
El código anterior no funciona para iOS 13. Una mejor manera de manejar esto es usar:
extension UISearchBar { var textField: UITextField? { return self.subviews(ofType: UITextField.self).first } } extension UIView { var recursiveSubviews: [UIView] { return self.subviews + self.subviews.flatMap { $0.recursiveSubviews } } func subviews<T: UIView>(ofType: T.Type) -> [T] { return self.recursiveSubviews.compactMap { $0 as? T } } }
fuente
// Prueba con este chico
fuente
Aquí hay una versión Xamarin.iOS C # del enfoque "buscar el UITextField". No se bloqueará si 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; } } }
fuente
Swift 5.2 y iOS 13.3.1: -
Funciona bien.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
fuente
En mi situación la solución es
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]]; [appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
fuente
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
fuente
Rápido 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
fuente
En Swift 5 puedes hacer algo como a continuación:
fuente
Esto funcionó para mí.
if #available(iOS 13.0, *) { searchBar.searchTextField.textColor = .white }
fuente
Swift 5 Xcode 11.4 iOS 13.4
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
fuente