Cambiar UITextField y UITextView Cursor / Caret Color

Respuestas:

513

Si está apuntando a iOS 7+, esto se ha hecho mucho más fácil. Simplemente cambie el tintColorcampo con un cursor usando el proxy de apariencia y se aplicará en toda la aplicación:

Swift 3.0:

UITextField.appearance().tintColor = .black 

C objetivo:

[[UITextField appearance] setTintColor:[UIColor blackColor]];

La misma respuesta aplica para un individuo UITextField:

Swift 3.0:

myTextField.tintColor = .black 

C objetivo

[myTextField setTintColor:[UIColor blackColor]];
DiscDev
fuente
13
Descubrí que esto causaba que los colores de tinte de mi elemento UIBarButton se fijaran a sus valores predeterminados, incluso si establecía el color de tinte en algo completamente diferente. Resolví el problema estableciendo el color de tinte de los UITextFields individualmente cuando se crean.
willtalmadge
Esto funciona, pero solo si lo haces en didFinishLaunching? ¿O puede hacerlo en función de la interacción del usuario, por ejemplo, presionar un botón?
Steffen Andersen
@SteffenAndersen debe comportarse de acuerdo con la documentación de la API del proxy UIAppearance.
DiscDev
[[Apariencia UITextView] setTintColor: teal]; por alguna razón, esto cambia el color de mis botones de la barra de navegación, ¿cómo configuró individualmente?
John
3
En Swift 3.0 use esto: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
44

Con iOS7, simplemente puede cambiar tintColor del textField

Gorra
fuente
20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
Peter Kreinz
fuente
1
En Swift 3.0 use esto: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
13

Nota: Esta respuesta está desactualizada y debe usarse solo para el desarrollo anterior a iOS 7. Vea otras respuestas para una solución de 1 línea usando el proxy de apariencia en iOS 7.

Llegué a esta pregunta después de enfrentar el mismo problema en un proyecto en el que estaba trabajando.

Logré crear una solución que será aceptada por el equipo de revisión de AppStore, ya que no utiliza ninguna API privada existente.

He creado un control llamado DGTextField que extiende UITextField.

Dov
fuente
Esto es genial. Honestamente, debido a esto, definitivamente estaré atento a "Conforme a" en los documentos. Sin embargo, me alegro de que solo una persona haya tenido que pasar el tiempo leyendo y jugando con esto. ¡Ojalá otras personas puedan ver y usar esto!
RileyE
Sin embargo, podría recomendar opciones de animación, eliminando @propery y simplemente creando setters y getters, así como setter y getter para el ancho de cursor personalizado. Puede que no te interese, ¡pero siempre me encantan los pequeños ajustes!
RileyE
@RileyE Me alegra que haya podido beneficiarse de mi solución. Siéntase libre de bifurcar el repositorio y agregar cualquier ajuste que desee compartir.
Dov
3
Es mucho más fácil en iOS 7: vea mi respuesta a continuación: stackoverflow.com/a/18945907/1103584
DiscDev
12
yourTextField.tintColor = [UIColor whiteColor];

Funciona si lo configura en código, porque de alguna manera el disparador de color no lo hace en el Creador de interfaces (Xcode 6.1.1). Se adapta bien sin necesidad de cambiar ningún proxy de apariencia.

David
fuente
2
Por alguna razón desconocida, no funciona para mí con whiteColor pero funciona con cualquier otro color (prueba en iOS 8). Tuve que establecer un color que sea casi blanco pero no blanco para que funcione.
Leszek Szary
@LeszekSzary ¡Hola! ¡Salvaste mi día! ¡Intenté casi 4 horas y tus palabras fueron la clave! Apple debería corregir este error loco que realmente vuelve loco al desarrollador.
Karthick Ramesh
10

Configuración tintColorde UITextFieldy UITextViewfunciona de forma diferente. Si bien UITextFieldno necesita llamar a un código adicional después de la actualización tintColorpara cambiar el color del cursor, pero sí UITextViewlo necesita.

Así que después de ajustar tintColorpara UITextView(no importa en IB o en el código) es necesario llamar textView.tintColorDidChange()con el fin de aplicarlo (en realidad pasará de configuración de vista de texto a su jerarquía subvistas).

ilya
fuente
5

Esto me funcionó rápidamente:

UITextField.tintColor = UIColor.blackColor()

También puede configurar esto en el guión gráfico: https://stackoverflow.com/a/18759577/3075340

Micro
fuente
Esto no funciona Recibí el error:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros el
@pableiros Lo anterior fue con Swift 2. ¿Quizás estás usando Swift 3 ahora?
Micro
Probé en Swift 3 y Swift 2.3, no estoy seguro de si funciona en Swift 2.2 y
versiones anteriores
3

Un enfoque más general sería establecer el tintColor de la apariencia de UIView.

UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];

Tiene sentido si está utilizando muchos elementos de IU predeterminados.

arnekolja
fuente
2
Hmmm ... esto tiene muchos otros efectos secundarios ... la pregunta es solo acerca de cambiar el color del cursor, y su respuesta va a teñir cada UIView en la aplicación ... este probablemente no sea el enfoque que la mayoría de la gente quiere tomar.
DiscDev
+1 en eso, demasiados efectos secundarios, si el objetivo es solo cambiar el color del cursor. Configurar UIView tintColor ES útil cuando está diseñando un contenedor (pero luego no lo usaría[UIView appearance]
colinta
2

Intenta, está funcionando para mí.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];
Durgesh
fuente
66
Eso está usando un método privado, pero gracias por la sugerencia. Esto puede hacer que una solicitud sea rechazada fácilmente.
RileyE
0

El enfoque de Durgesh funciona.

También usé tales soluciones KVC muchas veces. A pesar de que parece no estar documentado, pero funciona. Francamente, no utiliza ningún método privado aquí, solo la codificación de valor clave que es legal.

PD: ayer mi nueva aplicación apareció en AppStore sin ningún problema con este enfoque. Y no es el primer caso cuando uso KVC para cambiar algunas propiedades de solo lectura (como navigatonBar) o ivars privados.

malex
fuente
1
No está utilizando un método privado, sino que las claves no están documentadas, lo que significa que no se deben utilizar para aplicaciones en la App Store. Su solicitud puede ser rechazada subjetivamente. Debe haber tenido un amable revisor, ya que muchos han sido rechazados por usar ese método.
RileyE
Entonces tengo alrededor de 10 amables revisores :) y mis numerosos colegas también.
malex
1
Solo para aclarar, la "Codificación clave-valor" en este caso es asignar un valor a una propiedad utilizando el método de conveniencia. La razón por la que estamos usando eso, en comparación con un setter, es porque la propiedad es inaccesible / oculta / privada.
RileyE
1
Aquí quiero decir (quizás no sé algo importante) solo que la documentación sobre KVC no implica ninguna restricción literalmente. Así que uso con éxito todos estos. Y con suerte pueden otros.
malex
1
Apreciado. Sin embargo, Apple, en su 'Acuerdo de Términos de Uso', afirma que podemos usar y discutir abiertamente cualquier cosa incluida en su documentación y prohíbe el uso de métodos no documentados (se incluiría el acceso al método de establecimiento 'textInputTraits' a través de KVC, ya que el la propiedad no está documentada). Esencialmente, si no puede encontrar el método en la documentación, está prohibido. Sin embargo, prohibido no garantiza el rechazo. He rechazado algunas aplicaciones por razones incluidas en algunas de mis aplicaciones que llegan a la tienda. Es impredecible con métodos indocumentados.
RileyE
0

Para la versión de Interface Builder con Swift

@IBOutlet weak var tvValue: UITextView! {
        didSet {
            tvValue.tintColor = .black
        }
    }
Mike Glukhov
fuente
0

Si el UITextFieldes de UISearchBar, primero obtenga el textFieldde searchBary luego aplique la tintColorpropiedad:

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray

fuente
0

Swift 4

En viewDidLoad () simplemente llame al siguiente código:

CÓDIGO MUESTRA

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()
Shamshad
fuente
0

Creo que si desea algunos colores personalizados, puede ir a la Assets.xcassetscarpeta, hacer clic derecho y seleccionar New Color Set, una vez que haya creado el color que configuró, asígnele un nombre para reutilizarlo.

Y puedes usarlo así:

import UIKit 

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME")  #here
    }
}

Probado en macOS 10.15 / iOS 13 / Swift 5

oxido
fuente
0

Para las personas que buscan el equivalente en SwiftUI para Textfieldesto es accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Beninho85
fuente