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


Respuestas:


108

Tienes que acceder al UITextFieldinterior 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

1
He editado mi respuesta. Puede acceder al campo utilizando valueforkey ("searchField")
Christian

7
No es una API privada, pero es muy frágil y puede fallar en cualquier actualización de iOS. Nunca debería usar cosas como estas en el código de producción
Lope

2
@Christian: no importa cuándo se publicó la respuesta original, aún depende de la API privada. Si fuera público, no necesitaría acceder a searchFieldtravés de KVC.
Greg Brown

1
Votar en contra. Vea la respuesta de @juanjo y mi comentario para conocer un enfoque mucho más sólido aprobado por Apple y mucho menos probable que se rompa.
RobP

1
No use esta respuesta, está accediendo a API privadas y podría rechazar su aplicación.
aryaxt

63

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.

ingrese la descripción de la imagen aquí


2
Es mejor tener menos código para los elementos de la vista. Gracias.
NRR

¡Solución perfecta!
Mona

49

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]

Trabajando para mi.
Surjeet Rajput

y cambia de color para cada barra de búsqueda en el módulo?
Zaporozhchenko Oleksandr

48

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:

searchController.searchBar.barStyle = .black

@Bacon, ¡también ayudó! Gracias
Goppinath

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

Como tu solución. Gracias.
Bagusflyer

También puede agregar "searchField.backgroundColor" para controlar el color de fondo del campo de texto separado del tinte de la barra.
Sherwin Zadeh

13

Esto me funciona en iOS 11, Xcode 9:

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

Lo escribo en el AppDelegatepero supongo que funciona si lo pones en otro lugar también.


3
Este es un enfoque mucho más sólido que el sinsentido del valor clave en la respuesta aceptada y otras respuestas. Sin embargo, Apple en su sabiduría ha desaprobado la API que usa aquí y ofrece una nueva versión para iOS 9.0 y superior, así: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];esto es, por supuesto, Objective-C, con una traducción obvia a Swift usandoappearance(whenContainedInInstancesOf:)
RobP

2
No parece funcionar para mí en Xcode 10, iOS 12, en un dispositivo real.
Oded

10

Creo que la forma más conveniente es instalar una textColorpropiedad 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

no funciona para mí. ¿Cuándo establece la propiedad textcolor?
Kingalione

1
@Kingalione puede configurar esto en 'viewDidLoad ()'
Tal Zion

Sí, quería cambiar el color del texto del titular. Ahora encontré las soluciones. Gracias de todos modos
Kingalione

10

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

¡Finalmente! Podemos acceder al campo de texto directamente. Gracias, Saren.
Mark Moeykens

4

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.


3

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

3

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 UISearchBarclase personalizada , llamada SearchBar : UISearchBar, UISearchBarDelegate This SearchBartendrá los UISearchBarDelegatemétodos que quiero manejar y su delegateconjunto.

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 UITextFieldagradecimiento a UISearchBar.searchTextField, que es de tipo UISearchTextField, que hereda de UITextField.

Como conozco mi jerarquía, sé textFieldque no será nillpara 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 SearchBaragregando 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!).


2

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

para iOS 13 return subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
Taras

2

// Prueba con este chico

yourSearchbar.searchTextField.textColor = .white

1

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

1

Swift 5.2 y iOS 13.3.1: -

Funciona bien.

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


0

En mi situación la solución es

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

0

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

0

Rápido 5:

searchBar[keyPath: \.searchTextField].textColor = UIColor(...)


0

En Swift 5 puedes hacer algo como a continuación:

yourSearchBar.searchTextField.textColor = .yourColor

0

Esto funcionó para mí.

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }

-1

Swift 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.