¿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
cristiano
fuente
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í

interrumpir
fuente
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]
Chronikum
fuente
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
Tocino
fuente
@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
    }
}
Adam Waite
fuente
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.

juanjo
fuente
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
Tal Zion
fuente
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")
    }
}
Saren Inden
fuente
¡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.

Bucle infinito
fuente
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
    }
}
Omar Albeik
fuente
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!).

Bryan ORTIZ
fuente
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 }
    }
}
David Steppenbeck
fuente
para iOS 13 return subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
Taras
2

// Prueba con este chico

yourSearchbar.searchTextField.textColor = .white
Nrv
fuente
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;
        }
    }
}
t9mike
fuente
1

Swift 5.2 y iOS 13.3.1: -

Funciona bien.

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

Dinesh Kumar
fuente
0

En mi situación la solución es

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
poGUIst
fuente
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
Argos
fuente
0

Rápido 5:

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

ramzesenok
fuente
0

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

yourSearchBar.searchTextField.textColor = .yourColor
johnDoe
fuente
0

Esto funcionó para mí.

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }
Mili
fuente
-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)
blyscuit
fuente