Ändern Sie die UITextField- und UITextView-Cursor- / Caret-Farbe

222

Ich frage mich, ob ich die Farbe des Cursors / Carets in einem UITextField(und UITextViewwenn es die gleiche Antwort ist) in iOS ändern soll . Ich habe Antworten für die OSX-Entwicklung gesehen, aber nichts für iOS.

Ist das überhaupt möglich?

RileyE
quelle
1
Detaillierte Antwort für UITextField, einschließlich der Vorgehensweise
Mark Amery
1
Einfache und vollständige Antwort unter stackoverflow.com/a/18945907/1292230 ;)
RileyE

Antworten:

513

Wenn Sie auf iOS 7+ abzielen, wurde dies erheblich vereinfacht. Ändern Sie einfach tintColordas Feld mit einem Cursor mithilfe des Darstellungs-Proxys und es gilt für die gesamte App:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Ziel c:

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

Die gleiche Antwort gilt für eine Person UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Ziel c

[myTextField setTintColor:[UIColor blackColor]];
DiscDev
quelle
13
Ich habe festgestellt, dass dies dazu führte, dass die Farbtöne meiner UIBarButton-Elemente auf ihre Standardwerte festgelegt wurden, selbst wenn ich die Farbtonfarbe auf etwas völlig anderes eingestellt habe. Ich habe das Problem gelöst, indem ich die Farbtonfarbe der UITextFields beim Erstellen individuell festgelegt habe.
Willtalmadge
Dies funktioniert, aber nur, wenn Sie es in didFinishLaunching tun? Oder können Sie dies basierend auf Benutzerinteraktion tun, z. B. per Knopfdruck?
Steffen Andersen
@SteffenAndersen sollte sich gemäß der UIAppearance-Proxy-API-Dokumentation verhalten.
DiscDev
[[UITextView-Darstellung] setTintColor: teal]; Aus irgendeinem Grund ändert dies die Farbe meiner Navigationsknöpfe. Wie haben Sie sie individuell eingestellt?
John
3
Verwenden Sie unter Swift 3.0 Folgendes: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
44

Mit iOS7 können Sie einfach tintColor des textField ändern

Deckel
quelle
20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
Peter Kreinz
quelle
1
Verwenden Sie unter Swift 3.0 Folgendes: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
13

Hinweis: Diese Antwort ist veraltet und sollte nur für die Entwicklung vor iOS 7 verwendet werden. Weitere Antworten für eine 1-Zeilen-Lösung finden Sie unter dem Darstellungs-Proxy in iOS 7.

Ich kam zu dieser Frage, nachdem ich in einem Projekt, an dem ich arbeitete, auf dasselbe Problem gestoßen war.

Es ist mir gelungen, eine Lösung zu erstellen, die vom AppStore-Überprüfungsteam akzeptiert wird, da keine vorhandenen privaten APIs verwendet werden.

Ich habe ein Steuerelement namens DGTextField erstellt, das UITextField erweitert.

Dov
quelle
Das ist toll. Aus diesem Grund werde ich "Conforms to" in den Dokumenten auf jeden Fall genauer beobachten. Ich bin jedoch froh, dass nur eine Person die Zeit damit verbringen musste, darüber zu lesen und zu basteln. Hoffentlich können andere Leute dies sehen und nutzen!
RileyE
Ich kann jedoch Animationsoptionen empfehlen, das @propery entfernen und nur Setter und Getter sowie einen Setter und Getter für die benutzerdefinierte Caret-Breite erstellen. Sie mögen nicht interessiert sein, aber ich liebe immer die kleinen Verbesserungen!
RileyE
@RileyE Ich bin froh, dass Sie von meiner Lösung profitieren konnten. Fühlen Sie sich frei, das Repo zu teilen und alle Verbesserungen hinzuzufügen, die Sie teilen möchten.
Dov
3
In iOS 7 ist es viel einfacher - siehe meine Antwort unten: stackoverflow.com/a/18945907/1103584
DiscDev
12
yourTextField.tintColor = [UIColor whiteColor];

Es funktioniert, wenn Sie es im Code festlegen, da der Farbauslöser dies im Interface Builder (Xcode 6.1.1) nicht tut . Es passte gut, ohne dass ein Erscheinungsbild-Proxy geändert werden musste.

David
quelle
2
Aus irgendeinem unbekannten Grund funktioniert es bei whiteColor nicht, aber bei jeder anderen Farbe (Testen unter iOS 8). Ich musste eine Farbe einstellen, die fast weiß ist, aber nicht weiß, damit es funktioniert.
Leszek Szary
@LeszekSzary Hey! Du hast meinen Tag gerettet! Ich habe es fast 4 Stunden lang versucht und deine Worte waren der Anhaltspunkt! Apple sollte diesen verrückten Fehler beheben, der den Entwickler tatsächlich verrückt macht.
Karthick Ramesh
10

Einstellung tintColorfür UITextFieldund UITextViewfunktioniert anders. Zwar müssen UITextFieldSie nach dem Update keinen zusätzlichen Code aufrufen, um die Cursorfarbe tintColorzu ändern, aber UITextViewSie müssen.

Nach der Einstellung tintColorfür UITextView(es spielt keine Rolle in IB oder im Code) müssen Sie aufrufen, textView.tintColorDidChange()um es anzuwenden (tatsächlich wird die Konfiguration der Textansicht an die Hierarchie der Unteransichten übergeben).

ilya
quelle
5

Das hat bei mir schnell geklappt:

UITextField.tintColor = UIColor.blackColor()

Sie können dies auch im Storyboard festlegen: https://stackoverflow.com/a/18759577/3075340

Mikro
quelle
Das funktioniert nicht. Ich habe den Fehler bekommen:Instance member 'tintcolor' cannot be used on type 'UITextField'
Pableiros
@pableiros Das Obige war mit Swift 2. Vielleicht verwenden Sie jetzt Swift 3?
Micro
Ich habe es mit Swift 3 und Swift 2.3 versucht. Ich bin mir nicht sicher, ob es mit Swift 2.2 und niedriger funktioniert
Pableiros
3

Ein allgemeinerer Ansatz wäre, die tintColor des UIView-Erscheinungsbilds festzulegen.

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

Sinnvoll, wenn Sie viele Standardelemente der Benutzeroberfläche verwenden.

Arnekolja
quelle
2
Hmmm ... das hat viele andere Nebenwirkungen ... die Frage betrifft nur das Ändern der Caret-Farbe, und Ihre Antwort wird jede einzelne UIView in der App tönen ... dies ist wahrscheinlich nicht der Ansatz, den die meisten Leute wollen nehmen.
DiscDev
+1 dazu zu viele Nebenwirkungen, wenn das Ziel nur darin besteht, die Caret-Farbe zu ändern. Das Einstellen von UIView tintColor ist nützlich, wenn Sie einen Container stylen (aber dann würde ich ihn nicht verwenden[UIView appearance]
colinta
2

Versuchen Sie, es funktioniert für mich.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];
Durgesh
quelle
6
Das ist eine private Methode, aber danke für den Vorschlag. Dies kann leicht dazu führen, dass ein Antrag abgelehnt wird.
RileyE
0

Durgeshs Ansatz funktioniert.

Ich habe solche KVC-Lösungen auch oft verwendet. Trotzdem scheint es undokumentiert zu sein, aber es funktioniert. Ehrlich gesagt verwenden Sie hier keine privaten Methoden - nur die legale Schlüsselwertcodierung.

PS Gestern erschien meine neue App im AppStore ohne Probleme mit diesem Ansatz. Und es ist nicht der erste Fall, wenn ich KVC zum Ändern einiger schreibgeschützter Eigenschaften (wie navigatonBar) oder privater ivars verwende.

Malex
quelle
1
Es wird keine private Methode verwendet, sondern die Schlüssel sind nicht dokumentiert, was bedeutet, dass sie nicht für Anwendungen im App Store verwendet werden dürfen. Ihre Bewerbung kann subjektiv abgelehnt werden. Sie müssen einen freundlichen Prüfer gehabt haben, da viele für die Verwendung dieser Methode abgelehnt wurden.
RileyE
Dann habe ich ungefähr 10 nette Rezensenten :) und meine zahlreichen Kollegen auch.
Malex
1
Zur Verdeutlichung weist die "Schlüsselwertcodierung" in diesem Fall einer Eigenschaft mithilfe der Convenience-Methode einen Wert zu. Der Grund, warum wir das im Vergleich zu einem Setter verwenden, ist, dass die Eigenschaft nicht zugänglich / versteckt / privat ist.
RileyE
1
Hier meine ich (vielleicht weiß ich nichts Wichtiges) nur, dass die Dokumentation zu KVC keine wörtlichen Einschränkungen impliziert. Also nutze ich all diese erfolgreich. Und hoffentlich können andere.
Malex
1
Geschätzt. Apple erklärt jedoch in seiner "Nutzungsbedingungen", dass wir alles, was in seiner Dokumentation enthalten ist, verwenden und offen diskutieren dürfen, und verbietet die Verwendung von undokumentierten Methoden (der Zugriff auf die Setter-Methode "textInputTraits" über KVC wäre ebenso enthalten wie die Eigentum ist nicht dokumentiert). Wenn Sie die Methode nicht in der Dokumentation finden, ist sie grundsätzlich verboten. Verboten garantiert jedoch keine Ablehnung. Einige Anwendungen wurden aus Gründen abgelehnt, die in einigen meiner Apps enthalten sind, die es in den Store schaffen. Es ist ein Hit und Miss mit undokumentierten Methoden.
RileyE
0

Für die Interface Builder-Version mit Swift

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

Wenn das von UITextFieldist, UISearchBarholen Sie zuerst das textFieldvon searchBarund wenden Sie dann die tintColorEigenschaft an:

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

quelle
0

Swift 4

Rufen Sie in viewDidLoad () einfach den folgenden Code auf:

CODE-PROBE

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()
Shamshad
quelle
0

Ich denke, wenn Sie einige benutzerdefinierte Farben möchten, können Sie in den Assets.xcassetsOrdner gehen , mit der rechten Maustaste klicken und auswählen New Color Set, nachdem Sie die von Ihnen festgelegte Farbe erstellt haben, geben Sie ihr einen Namen, um sie wiederzuverwenden.

Und Sie können es einfach so verwenden:

import UIKit 

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

Getestet unter macOS 10.15 / iOS 13 / Swift 5

Rost
quelle
0

Für Leute, die in SwiftUI nach dem Äquivalent suchen, ist Textfielddies accentColor:

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