Quiero que mi barra de búsquedas del matiz de color de blanco (es decir, el botón cancelar ser de color blanco). El cursor no está visible cuando el tono de color es el blanco. Es allí una manera de establecer el cursor de color por separado?

12 Comentarios

  1. 64

    Conjunto de su tinte de color para el color que usted desea que el botón cancelar para ser y, a continuación, utilizar la UIAppearance Protocolo para cambiar el matiz de color en el campo de texto para ser el color que usted desea que el cursor se. Ex:

    [self.searchBar setTintColor:[UIColor whiteColor]];                
    [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor darkGrayColor]];
    
    • No sé por qué, por el presente código (segunda línea) también cambia de tono para la barButton en la siguiente modal de la escena. Así que he usado @Felipe respuesta a continuación.
    • Yo tenía el mismo problema que tzaloga. Alguien alguna idea de por qué esto afecta modal escena del botón de la barra de color del elemento?
  2. 13

    Si usted es aficionado de funcional, todavía molesto uno-trazadores de líneas en Swift, tengo Benjamín del bucle for se reduce a esto:

    searchController.searchBar.tintColor = UIColor.whiteColor()
    
    searchController.searchBar.subviews[0].subviews.flatMap(){ $0 as? UITextField }.first?.tintColor = UIColor.blueColor()
    
  3. 8

    Swift 3.0 y 4 de la versión

    searchController.searchBar.tintColor = .white        
    UITextField.appearance(whenContainedInInstancesOf: [type(of: searchController.searchBar)]).tintColor = .black
    

    Nota de que la barra de búsquedas no puede ser opcional.

  4. 6

    Compacto Swift 2.0 utilizando la solución por donde sintaxis (no hay necesidad de romper el bucle):

    //Make SearchBar's tint color white to get white cancel button.
    searchBar.tintColor = UIColor.white()
    
    //Loop into it's subviews and find TextField, change tint color to something else.
    for subView in searchBar.subviews[0].subviews where subView.isKindOfClass(UITextField) {
            subView.tintColor = UIColor.darkTextColor()
    }
    
    • Esto funcionó para mí, cuando yo quería cambiar el cursor de color por sólo una barra de búsquedas.
  5. 5
    searchBar.tintColor = [UIColor whiteColor];
    searchBar.backgroundColor = [UIColor clearColor];
    for ( UIView *v in [searchBar.subviews.firstObject subviews] )
    {
        if ( YES == [v isKindOfClass:[UITextField class]] )
        {
            [((UITextField*)v) setTintColor:[UIColor blueColor]];
            break;
        }
    }
    

    Cursor de cambio de color en UISearchBar sin cambiar tintColor

  6. 5

    Esto se parecía a trabajar para mí en swift así.

        searchController.searchBar.tintColor = UIColor.whiteColor()
        UITextField.appearanceWhenContainedInInstancesOfClasses([searchController.searchBar.dynamicType]).tintColor = UIColor.blackColor()
    
    • Tanto Felipe & Eric soluciones de trabajo para mí, pero me siento más cómodo con la solución de Eric.
  7. 4

    Para aquellos que buscan hacer de la misma en Swift, aquí es una solución que se me vino accros después de un montón de problemas :

    override func viewWillAppear(animated: Bool) {
        self.searchBar.tintColor = UIColor.whiteColor()
    
        let view: UIView = self.searchBar.subviews[0] as! UIView
        let subViewsArray = view.subviews
    
        for (subView: UIView) in subViewsArray as! [UIView] {
            println(subView)
            if subView.isKindOfClass(UITextField){
                subView.tintColor = UIColor.blueColor()
            }
        }
    
    }
    
  8. 3

    Acabo de añadir una extensión a UISearchBar con el siguiente código.

    extension UISearchBar {
        var cursorColor: UIColor! {
            set {
                for subView in self.subviews[0].subviews where ((subView as? UITextField) != nil) {
                    subView.tintColor = newValue
                }
            }
            get {
                for subView in self.subviews[0].subviews where ((subView as? UITextField) != nil) {
                    return subView.tintColor
                }
                //Return default tintColor
                return UIColor.eightBit(red: 1, green: 122, blue: 255, alpha: 100)
            }
        }
    }
    
  9. 2

    iOS 9 y anteriores

    La forma más sencilla para establecer un tintColor diferentes para el botón cancelar y textField, utilice esto:

    self.searchBar setTintColor:[UIColor whiteColor]];
    [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:UIColor.blueColor];
    
  10. 1

    Esta es la solución más fácil.

    let textField = self.searchBar.value(forKey: "searchField") as! UITextField
    
        textField.tintColor = UIColor.white
    
    • let textField = self.searchBar.value(forKey: "searchField") as? UITextField; textField?.tintColor = UIColor.white evita obligado a desenvolver y por lo tanto no se bloquea.
  11. 0

    Más fácil en Swift 5:

        UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = .black
    
  12. 0

    Aquí es un «funcional» versión de Felipe respuesta (Swift 4.2)

    //Make SearchBar's tint color white to get white cancel button.
    searchBar.tintColor = .white
    
    //Get the TextField subviews, change tint color to something else.
    if let textFields = searchBar.subviews.first?.subviews.compactMap({ $0 as? UITextField }) {
            textFields.forEach { $0.tintColor = UIColor.darkGray }
    }
    

Dejar respuesta

Please enter your comment!
Please enter your name here