Cambia UITextField e UITextView Cursor / Caret Color


222

Mi chiedo di cambiare il colore del cursore / cursore in un UITextField(e UITextViewse è la stessa risposta) in iOS. Ho visto le risposte per lo sviluppo di OSX, ma niente per iOS.

È possibile?


1
Risposta dettagliata per UITextField, incluso come fare in Interface Builder, su stackoverflow.com/a/18759577/1709587
Mark Amery

1
Semplice e risposta completa a stackoverflow.com/a/18945907/1292230 ;)
RileyE

Risposte:


513

Se scegli come target iOS 7+, questo è stato reso molto più semplice. Basta cambiare il tintColorcampo con un cursore usando il proxy aspetto e si applicherà in tutta l'app:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Objective-C:

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

La stessa risposta vale per un individuo UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Objective-C

[myTextField setTintColor:[UIColor blackColor]];

13
Ho scoperto che ciò ha causato il fissaggio dei colori della tinta del mio oggetto UIBarButton ai valori predefiniti anche se ho impostato il colore della tinta su qualcosa di completamente diverso. Ho risolto il problema impostando il colore della tinta degli UITextField singolarmente quando vengono creati.
willtalmadge,

Funziona, ma solo se lo fai in didFinishLaunching? Oppure puoi farlo in base all'interazione dell'utente, ad esempio premere un pulsante?
Steffen Andersen,

@SteffenAndersen dovrebbe comportarsi in base alla documentazione dell'API proxy UIAppearance.
DiscDev

[[UITextView aspect] setTintColor: teal]; per qualche motivo questo cambia il colore dei miei pulsanti di navigazione, come hai impostato individualmente?
John,

3
Su Swift 3.0 usa questo: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato

44

Con iOS7 puoi semplicemente cambiare tintColor del textField


20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black

1
Su Swift 3.0 usa questo: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato

13

Nota: questa risposta non è aggiornata e deve essere utilizzata solo per lo sviluppo precedente a iOS 7. Guarda le altre risposte per una soluzione a 1 riga usando il proxy aspetto in iOS 7.

Sono arrivato a questa domanda dopo aver affrontato lo stesso problema in un progetto a cui stavo lavorando.

Sono riuscito a creare una soluzione che verrà accettata dal team di revisione di AppStore in quanto non utilizza alcuna API privata esistente.

Ho creato un controllo chiamato DGTextField che estende UITextField.


Questo è fantastico Onestamente, per questo motivo, terrò sicuramente d'occhio più da vicino su "Conforme a" nei documenti. Tuttavia, sono contento che solo una persona abbia dovuto passare il tempo a leggere e armeggiare su questo. Spero che altre persone possano vederlo e usarlo!
RileyE,

Tuttavia, potrei raccomandare opzioni di animazione, rimuovendo @propery e semplicemente creando setter e getter, nonché un setter e getter per la larghezza del cursore personalizzata. Potresti non essere interessato, ma adoro sempre le piccole modifiche!
RileyE,

@RileyE Sono felice che tu abbia potuto beneficiare della mia soluzione. Sentiti libero di rovesciare il repository e aggiungere eventuali modifiche che desideri condividere.
Dov

3
E 'molto più facile in iOS 7 - vedere la mia risposta qui sotto: stackoverflow.com/a/18945907/1103584
DiscDev

12
yourTextField.tintColor = [UIColor whiteColor];

Funziona se lo imposti nel codice, perché in qualche modo il trigger di colore non lo fa in Interface Builder (Xcode 6.1.1). Si adattava bene senza la necessità di modificare alcun proxy aspetto.


2
Per qualche ragione sconosciuta non funziona con me WhiteColor ma funziona con qualsiasi altro colore (test su iOS 8). Ho dovuto impostare un colore quasi bianco ma non bianco per farlo funzionare.
Leszek Szary,

@LeszekSzary Hey! Mi hai salvato la giornata! Stavo provando quasi 4 ore e le tue parole erano l'indizio! Apple dovrebbe risolvere questo bug folle che fa impazzire lo sviluppatore.
Karthick Ramesh,

10

Impostazione tintColorper UITextFielde UITextViewfunziona in modo diverso. Mentre per UITextFieldte non è necessario chiamare un codice aggiuntivo dopo l'aggiornamento tintColorper cambiare il colore del cursore, ma per UITextViewte è necessario.

Così, dopo aver impostato tintColorper UITextView(non importa in IB o in codice) è necessario chiamare textView.tintColorDidChange()al fine di applicarlo (in realtà passerà di configurazione di vista del testo fino alla sua gerarchia subviews).


5

Questo ha funzionato per me rapidamente:

UITextField.tintColor = UIColor.blackColor()

Puoi anche impostare questo nello storyboard: https://stackoverflow.com/a/18759577/3075340


Questo non funziona Ho ricevuto l'errore:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros,

@pableiros Quanto sopra era con Swift 2. Forse stai usando Swift 3 ora?
Micro

Ho provato su Swift 3 e Swift 2.3, non sono sicuro che su Swift 2.2 e
versioni precedenti funzioni

3

Un approccio più generale sarebbe quello di impostare il colorColor dell'aspetto di UIView.

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

Ha senso se stai usando molti elementi dell'interfaccia utente predefiniti.


2
Hmmm ... questo ha molti altri effetti collaterali ... la domanda è solo quella di cambiare il colore del cursore, e la tua risposta tingerà ogni singolo UIView nell'app ... questo probabilmente non è l'approccio che molte persone vogliono prendere.
DiscDev

+1 su quello, troppi effetti collaterali, se l'obiettivo è solo quello di cambiare il colore del cursore. L'impostazione di UIView tintColor È utile quando si disegna uno stile su un contenitore (ma poi non lo [UIView appearance]
userei

2

Prova, funziona per me.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];

6
Sta usando un metodo privato, ma grazie per il suggerimento. Questo può facilmente ottenere una domanda respinta.
RileyE


0

L'approccio di Durgesh funziona.

Ho anche usato tali soluzioni KVC molte volte. Nonostante sembri non documentato, ma funziona. Francamente, non usi alcun metodo privato qui - solo la codifica di valori-chiave che è legale.

PS Ieri la mia nuova app è apparsa su AppStore senza problemi con questo approccio. E non è il primo caso in cui utilizzo KVC per modificare alcune proprietà di sola lettura (come navigatonBar) o ivar privati.


1
Non utilizza un metodo privato, ma piuttosto le chiavi non sono documentate, il che significa che non devono essere utilizzate per le applicazioni sull'App Store. La tua domanda potrebbe essere respinta in modo soggettivo. Devi aver avuto un gentile revisore, poiché molti sono stati rifiutati per l'utilizzo di quel metodo.
RileyE

Poi ho circa 10 recensori gentili :) e anche i miei numerosi colleghi.
malex,

1
Giusto per chiarire, la "codifica del valore-chiave" in questo caso sta assegnando un valore a una proprietà usando il metodo convenienza. Il motivo per cui lo stiamo usando, rispetto a un setter, è perché la proprietà è inaccessibile / nascosta / privata.
RileyE

1
Qui intendo (forse non so qualcosa di importante) solo che la documentazione su KVC non implica alcuna restrizione alla lettera. Quindi uso tutti questi con successo. E speriamo che altri possano farlo.
malex,

1
Apprezzato. Tuttavia, Apple, nel loro "Accordo sui Termini di utilizzo" afferma che ci è permesso di usare e discutere apertamente di qualsiasi cosa inclusa nella loro documentazione e proibisce l'uso di metodi non documentati (L'accesso al metodo setter "textInputTraits" tramite KVC sarebbe incluso, poiché il proprietà non documentata). In sostanza, se non riesci a trovare il metodo nella documentazione, è proibito. Vietato, tuttavia, non garantisce il rifiuto. Alcune applicazioni sono state respinte per motivi inclusi in alcune delle mie app che arrivano allo store. È incostante con metodi non documentati.
RileyE

0

Per la versione di Interface Builder con Swift

@IBOutlet weak var tvValue: UITextView! {
        didSet {
            tvValue.tintColor = .black
        }
    }

0

Se il UITextFieldè da UISearchBarallora prima ottenere il textFieldda searchBare quindi applicare la tintColorproprietà:

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

0

Swift 4

In viewDidLoad () basta chiamare sotto il codice:

CODICE CAMPIONE

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

Penso che se vuoi dei colori personalizzati puoi andare nella Assets.xcassetscartella, fare clic con il tasto destro e selezionareNew Color Set , una volta creato il colore che hai impostato, assegnagli un nome per riutilizzarlo.

E puoi usarlo così:

import UIKit 

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

Testato su macOS 10.15 / iOS 13 / Swift 5


0

Per chi cerca l'equivalente in SwiftUI Textfieldquesto è accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.