Ich benutze ein UITextField
mit einemUIPickerView
für sein inputView
, so dass, wenn der Benutzer auf das Textfeld tippt, eine Auswahl aufgerufen wird, aus der er eine Option auswählen kann.
Fast alles funktioniert, aber ich habe ein Problem: Der Cursor blinkt immer noch im Textfeld, wenn er aktiv ist, was hässlich und unangemessen ist, da vom Benutzer nicht erwartet wird, dass er in das Feld tippt und keine Tastatur angezeigt wird. Ich weiß , ich könnte hackily dieses Problem lösen , indem Sie editing
auf NO
auf dem Textfeld und Tracking berührt es, oder es mit einem individuell gestalteten Knopf ersetzt, und beschwören der Picker über Code. Ich möchte jedoch die UITextFieldDelegate
Methoden für die gesamte Ereignisbehandlung im Textfeld verwenden, und Hacks wie das Ersetzen des Textfelds durch eine Schaltfläche erlauben diesen Ansatz nicht.
Wie kann ich UITextField
stattdessen einfach den Cursor auf dem verstecken ?
quelle
Ab iOS 7 können Sie jetzt einfach
tintColor = [UIColor clearColor]
das Textfeld einstellen und das Caret verschwindet.quelle
caretRectForPosition:
Override-Lösung.Sie können einfach die tintColor des Textfelds löschen
Swift 3.0
quelle
Möglicherweise möchten Sie den Benutzer auch daran hindern, Text auszuwählen, zu kopieren oder einzufügen, damit die einzige Texteingabe aus der Auswahlansicht stammt.
http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/
quelle
Überprüfen Sie die Eigenschaft
selectedTextRange
des ProtokollsUITextInput
, dem die KlasseUITextField
entspricht. Wenige! Das ist genau dort eine Lektion in objektorientierter Programmierung.Caret verstecken
Um das Caret auszublenden, deaktivieren Sie den ausgewählten Textbereich des Textfelds.
Caret einblenden
Hier sind zwei Möglichkeiten, um das Caret einzublenden.
Stellen Sie den ausgewählten Textbereich des Textfelds auf das Ende des Dokuments ein.
Um das Caret an derselben Stelle zu halten, speichern Sie zunächst den ausgewählten Textbereich des Textfelds in einer Instanzvariablen.
Wenn Sie das Caret einblenden möchten, setzen Sie einfach den ausgewählten Textbereich des Textfelds auf den ursprünglichen Wert zurück:
quelle
caretRectForPosition
. Es ist expliziter, was es tut, und die von Ihnen zitierten Dokumente machen nicht klar, wie sich das Caret verhalten soll, wenn keine aktuelle Auswahl vorliegt. Wenn @ ArtGeigels Behauptung, dass dies nicht funktioniert, richtig wäre (was zumindest meines Erachtens nicht der Fall ist), wäre es nicht klar, dass dies ein Fehler wäre.Die vom OP bereitgestellte Antwort wurde aus dem Fragenkörper kopiert, um den ständig wachsenden Schwanz unbeantworteter Fragen zu beseitigen.
Ich habe eine andere Lösung gefunden: Unterklasse
UIButton
und überschreiben diese MethodenJetzt hat die Schaltfläche als ein
UIResponder
ähnliches Verhalten wieUITextField
und eine Implementierung ziemlich einfach.quelle
UITextFieldDelegate
können, um Bearbeitungsereignisse zu beginnen und zu beenden. Stattdessen müssen Sie - es sei denn, es gibt eine Möglichkeit, mit Ereignissen umzugehen, von denen ich nichts weiß - überschreibenbecomeFirstResponder
undresignFirstResponder
in der Schaltflächenunterklasse möglicherweise Ihr eigenes Delegatenprotokoll erstellen, einedelegate
Eigenschaft hinzufügen und den Delegaten über die oben genannten Elemente aufrufen Methoden. Dies alles ist weit mehr Arbeit als nur das ÜberschreibencaretRectForPosition
in einerUITextField
Unterklasse.UIResponder
Klassenreferenz noch nie genau angesehen und hatte keine Ahnung, dass ein solcher Trick möglich war.UITextField
den Cursor zu verwenden und zu verstecken, was im Grunde ein Hack ist, da wir dann das Textfeld als Beschriftung verwenden keine der Funktionen derUITextField
.Swift 5-Version von Net's Post
quelle
Stellen Sie tintColor auf Clear Color
und Sie können auch über den Interface Builder festlegen
quelle
Wenn Sie den Cursor ausblenden möchten, können Sie dies einfach verwenden! Es hat bei mir funktioniert ..
quelle
Die vom OP bereitgestellte Antwort wurde aus dem Fragenkörper kopiert, um den ständig wachsenden Schwanz unbeantworteter Fragen zu beseitigen.
Ich denke, ich habe die richtige Lösung, aber wenn sie verbessert werden kann, ist dies willkommen :) Nun, ich habe eine Unterklasse von UITextField erstellt und die Methode überschrieben, die CGRect für die Grenzen zurückgibt
Das Problem? Der Text wird nicht angezeigt, da der Rect Null ist. Aber ich habe ein UILabel als Unteransicht des Steuerelements hinzugefügt und die setText-Methode überschrieben. Wenn wir also wie gewohnt einen Text eingeben, ist der Textfeldtext null und die Bezeichnung, die den Text anzeigt
Damit funktioniert das Ding wie erwartet. Kennen Sie einen Weg, um es zu verbessern?
quelle
Um sowohl den Cursor als auch das Menü zu deaktivieren, verwende ich die Unterklasse mit diesen beiden Methoden:
quelle
Ich unterteile einfach
UITextField
und überschreibelayoutSubviews
wie folgt:Es ist ein schmutziger Hack und kann in Zukunft fehlschlagen (an diesem Punkt ist der Cursor wieder sichtbar - Ihre App stürzt nicht ab), aber es funktioniert.
quelle
Sie können einer Kategorie über zugeordnete Objekte eine
BOOL cursorless
Eigenschaft hinzufügenUITextField
.Verwenden Sie dann die Methode swizzling, um
caretRectForPosition:
mit einer Methode zu wechseln , die zwischenCGRectZero
und ihrem Standardwert mit umschaltetcursorless
.Dies führt zu einer einfachen Schnittstelle über eine Drop-In-Kategorie. Dies wird in den folgenden Dateien demonstriert.
Legen Sie sie einfach ab und profitieren Sie von dieser einfachen Benutzeroberfläche
UITextField
Kategorie: https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.h https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless .mMethoden-Swizzling: https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject% 2BRXRuntimeAdditions.m
quelle