¿Cómo puedo cambiar el color del texto de un UISearchBar
?
Respuestas:
Tienes que acceder al UITextField
interior del UISearchBar. Puedes hacerlo usandovalueForKey("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
searchField
través de KVC.
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]
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
}
}
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.
[[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
propiedad 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
Desde Xcode 11 e iOS 13, es posible acceder al campo de texto directamente:
searchBar.searchTextField
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")
}
}
Prueba esto,
searchBar.searchTextField.textColor = .white
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.
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
}
}
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 , llamada SearchBar : UISearchBar, UISearchBarDelegate
This SearchBar
tendrá los UISearchBarDelegate
métodos que quiero manejar y su delegate
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 a UISearchBar.searchTextField
, que es de tipo UISearchTextField
, que hereda de UITextField
.
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!).
(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 }
}
}
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;
}
}
}
Swift 5.2 y iOS 13.3.1: -
Funciona bien.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Rápido 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)