Meine Anwendung verwendet eine UITextView
. Jetzt möchte ich, dass der UITextView
Platzhalter ähnlich dem ist, den Sie für einen festlegen können UITextField
.
Wie macht man das?
ios
objective-c
cocoa-touch
uitextview
placeholder
Benutzer142019
quelle
quelle
UITextView
die Lösung verwenden, wird sie ganz anders. Hier sind einige Lösungen. Floating Placeholder und Fake Native PlaceholdersAntworten:
Ich habe ein paar kleinere Änderungen an der Lösung von bcd vorgenommen, um die Initialisierung aus einer
Xib
Datei und das Umbrechen von Text zu ermöglichen und die Hintergrundfarbe beizubehalten. Hoffentlich erspart es anderen die Mühe.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
quelle
Erstellen Sie auf einfache Weise Platzhaltertext
UITextView
mit den folgendenUITextViewDelegate
Methoden:Denken Sie daran,
myUITextView
den genauen Text für die Erstellung festzulegen, zund machen Sie die übergeordnete Klasse zu einem,
UITextViewDelegate
bevor Sie diese Methoden einschließen, zCode für Swift 3.1
Denken Sie daran,
myUITextView
den genauen Text für die Erstellung festzulegen, zund machen Sie die übergeordnete Klasse zu einem,
UITextViewDelegate
bevor Sie diese Methoden einschließen, zquelle
text
Attribut der Textansicht nicht manipulieren, was irgendwie nett ist ... obwohl diese Methode es modifiziertIch war mit keiner der veröffentlichten Lösungen zufrieden, da sie etwas schwer waren. Das Hinzufügen von Ansichten zur Ansicht ist nicht wirklich ideal (insbesondere in
drawRect:
). Sie hatten beide Lecks, was auch nicht akzeptabel ist.Hier ist meine Lösung: SAMTextView
SAMTextView.h
SAMTextView.m
Es ist viel einfacher als die anderen, da es keine Unteransichten verwendet (oder Lecks aufweist). Fühlen Sie sich frei, es zu benutzen.
Update 10.11.11: Es ist jetzt dokumentiert und unterstützt die Verwendung in Interface Builder.
Update 24.11.13: Zeigen Sie auf neues Repo.
quelle
setText
um auch den Platzhalter zu aktualisieren, wenn die Texteigenschaft programmgesteuert geändert wird: - (void) setText: (NSString *) string {[super setText: string]; [self _updateShouldDrawPlaceholder]; }notification
Argument ist jedoch in der letzten Methode falsch geschrieben, und es ist eine zu kleine Änderung, um sie als Bearbeitung einzureichen.Ich fand einen sehr einfachen Weg, einen Platzhalter nachzuahmen
Bearbeiten:
Die if-Anweisungen wurden geändert, um Tags anstelle von Text zu vergleichen. Wenn der Benutzer seinen Text löschte, war es auch möglich, versehentlich einen Teil des
@"Foobar placeholder"
Platzhalters zu löschen. Dies bedeutete, dass der Benutzer-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
nicht wie erwartet funktionieren würde, wenn der Benutzer die folgende Delegate-Methode erneut eingeben würde. Ich habe versucht, anhand der Farbe des Textes in der if-Anweisung zu vergleichen, aber festgestellt, dass die im Interface Builder festgelegte hellgraue Farbe nicht mit der im Code mit festgelegten hellgrauen Farbe übereinstimmt[UIColor lightGreyColor]
Es ist auch möglich, den Platzhaltertext zurückzusetzen, wenn die Tastatur zurückkehrt und die [textView-Länge] == 0 ist
BEARBEITEN:
Um den letzten Teil klarer zu machen, können Sie den Platzhaltertext folgendermaßen zurücksetzen:
quelle
Sie können die Textansicht mit einem Anfangswert in der
text
Eigenschaft einrichten und dentextColor
in[UIColor grayColor]
oder etwas Ähnliches ändern . Wenn die Textansicht bearbeitet werden kann, löschen Sie den Text und zeigen Sie einen Cursor an. Wenn das Textfeld jemals wieder leer ist, setzen Sie Ihren Platzhaltertext zurück. Ändern Sie die Farbe[UIColor blackColor]
entsprechend.Es ist nicht genau das Gleiche wie die Platzhalterfunktionalität in einem UITextField, aber es ist nah.
quelle
Sie können die Beschriftung auf dem
UITextView
by einstellenund verstecke es auf
TextViewdidChange
Methode.Dies ist der einfache und einfache Weg.
quelle
Wenn jemand eine Lösung für Swift benötigt:
Fügen Sie Ihrer Klasse UITextViewDelegate hinzu
quelle
Einfache Swift 3- Lösung
Fügen Sie
UITextViewDelegate
Ihrer Klasse hinzueinstellen
yourTextView.delegate = self
Erstellen
placeholderLabel
und positionieren Sie es im InnerenyourTextView
Jetzt nur noch animieren
placeholderLabel.alpha
auftextViewDidChange
:Möglicherweise müssen Sie mit der
placeholderLabel
Position spielen, um sie richtig einzurichten, aber das sollte nicht zu schwer seinquelle
let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
Ich habe die Antwort von KmKndy erweitert, sodass der Platzhalter sichtbar bleibt, bis der Benutzer mit der Bearbeitung beginnt,
UITextView
anstatt nur darauf zu tippen. Dies spiegelt die Funktionalität in den Twitter- und Facebook-Apps wider. Meine Lösung erfordert keine Unterklasse und funktioniert, wenn der Benutzer Text direkt eingibt oder einfügt!Denken Sie daran, myUITextView mit dem genauen Text für die Erstellung festzulegen, z
und machen Sie die übergeordnete Klasse zu einem UITextView-Delegaten, bevor Sie diese Methoden einschließen, z
quelle
Ich empfehle zu verwenden
SZTextView
.https://github.com/glaszig/SZTextView
Fügen Sie Ihre Standardeinstellung
UITextView
von hinzustoryboard
und ändern Sie die benutzerdefinierte KlasseSZTextView
wie folgt 👇👇👇👇Dann sehen Sie zwei neue Optionen im
Attribute Inspector
👇👇👇👇quelle
Unten finden Sie eine Swift-Portierung des ObjC-Codes "SAMTextView", die als eine der ersten paar Antworten auf die Frage veröffentlicht wurde. Ich habe es unter iOS 8 getestet. Ich habe einige Dinge optimiert, einschließlich des Grenzversatzes für die Platzierung des Platzhaltertextes, da das Original zu hoch und zu weit rechts war (in einem der Kommentare zu diesem Beitrag wurde ein Vorschlag verwendet).
Ich weiß, dass es viele einfache Lösungen gibt, aber ich mag den Ansatz der Unterklasse von UITextView, weil es wiederverwendbar ist und ich keine Klassen durcheinander bringen muss, die es mit den Mechanismen verwenden.
Swift 2.2:
Swift 4.2:
quelle
so habe ich es gemacht:
UITextView2.h
UITextView2.m
quelle
Hier ist eine viel einfachere Lösung, die sich genau wie der Platzhalter von UITextField verhält, jedoch keine benutzerdefinierten Ansichten zeichnen oder den Ersthelfer zurücktreten muss.
(Die zweite Überprüfung in der else if-Anweisung gilt für den Fall, dass nichts eingegeben wird und der Benutzer die Rücktaste drückt.)
Legen Sie einfach Ihre Klasse als UITextViewDelegate fest. In viewDidLoad sollten Sie wie initialisieren
quelle
Hallo, Sie können IQTextView verwenden, das in IQKeyboard Manager verfügbar ist. Es ist einfach zu verwenden und zu integrieren. Legen Sie einfach die Klasse Ihrer Textansicht in IQTextView fest. Sie können die Eigenschaft zum Festlegen der Platzhalterbeschriftung mit der gewünschten Farbe verwenden. Sie können die Bibliothek von IQKeyboardManager herunterladen
oder Sie können es von Cocoapods installieren.
quelle
UITextViewDelegate
funktionierteEs tut mir leid, eine weitere Antwort hinzuzufügen, aber ich habe gerade so etwas abgezogen und dadurch den Platzhalter erstellt, der UITextField am nächsten kommt.
Hoffe das hilft jemandem.
quelle
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
Andernfalls wurde das erste Zeichen, das in die Textansicht eingegeben wurde, am Ende des Textes platziertEinfache Möglichkeit, dies in einer Codezeile zu verwenden:
Nehmen Sie ein Etikett bis zu UITextView in .nib und verbinden Sie dieses Etikett mit Ihrem Code.
quelle
Ich habe die Implementierung von Sam Soffes für iOS7 geändert:
Denken Sie daran,
_placeholderAttribues = nil
Methoden festzulegen, die die Schriftart ändern können, sowie andere Zeichen, die sie möglicherweise beeinflussen. Möglicherweise möchten Sie auch das "faule" Erstellen des Attributwörterbuchs überspringen, wenn Sie dies nicht stört.BEARBEITEN:
Denken Sie daran, setNeedsDisplay in einer überschriebenen Version von setBounds aufzurufen, wenn der Platzhalter nach Autolayout-Animationen und Ähnlichem gut aussehen soll.
quelle
Sie können auch eine neue Klasse TextViewWithPlaceholder als Unterklasse von UITextView erstellen.
(Dieser Code ist etwas rau - aber ich denke, er ist auf dem richtigen Weg.)
Fügen Sie in Ihrem Delegaten Folgendes hinzu:
quelle
Ich habe meine eigene Version der Unterklasse von 'UITextView' erstellt. Ich mochte Sam Soffes 'Idee, die Benachrichtigungen zu verwenden, aber ich mochte das drawRect: overwrite nicht. Scheint mir übertrieben. Ich denke, ich habe eine sehr saubere Implementierung gemacht.
Sie können meine Unterklasse hier ansehen . Ein Demo-Projekt ist ebenfalls enthalten.
quelle
Dieser Thread hatte viele Antworten, aber hier ist die Version, die ich bevorzuge.
Es erweitert die vorhandene
UITextView
Klasse, ist also leicht wiederverwendbar und es nicht abfangen , die Ereignisse wietextViewDidChange
(die Benutzer-Code brechen könnten, wenn sie bereits diese Ereignisse an anderer Stelle abfängt wurden).Mit meinem Code (siehe unten) können Sie jedem Ihrer Platzhalter ganz einfach einen Platzhalter hinzufügen
UITextViews
:Wenn Sie diesen neuen Platzhalterwert festlegen, wird stillschweigend ein Zusatz
UILabel
zu Ihrem hinzugefügtUITextView
bei Bedarf ausgeblendet / angezeigt:Okay, um diese Änderungen vorzunehmen, fügen Sie eine "UITextViewHelper.h" -Datei hinzu, die diesen Code enthält:
... und eine UITextViewHelper.m-Datei, die Folgendes enthält:
Ja, es ist viel Code, aber sobald Sie ihn Ihrem Projekt hinzugefügt und die .h-Datei hinzugefügt haben ...
... können Sie problemlos Platzhalter in verwenden
UITextViews
.Es gibt aber einen Fall.
Wenn du das tust:
... wird der Platzhalter über dem Text angezeigt. Wenn Sie den
text
Wert festlegen , wird keine der regulären Benachrichtigungen aufgerufen, sodass ich nicht herausfinden konnte, wie ich meine Funktion aufrufen soll, um zu entscheiden, ob der Platzhalter ein- oder ausgeblendet werden soll.Die Lösung besteht darin,
textValue
Folgendes festzulegentext
:Alternativ können Sie den
text
Wert festlegen und dann aufrufencheckIfNeedToDisplayPlaceholder
.Ich mag solche Lösungen, weil sie die Lücke zwischen dem, was Apple uns bietet, und dem, was wir (als Entwickler) tatsächlich brauchen , "füllen" in unseren Apps . Sie schreiben diesen Code einmal, fügen ihn Ihrer Bibliothek mit "helper" .m / .h-Dateien hinzu, und im Laufe der Zeit wird das SDK tatsächlich weniger frustrierend.
(Ich habe einen ähnlichen Helfer geschrieben, um meinen UITextViews einen "Löschen" -Button hinzuzufügen, eine andere Sache, die ärgerlich in,
UITextField
aber nicht inUITextView
... existiert.)quelle
Nehmen Sie zuerst ein Etikett in die .h-Datei.
Hier nehme ich
Dann deklarieren Sie es in .m unter viewDidLoad
Textansicht ist meine Textansicht.
Jetzt erklären
Und Ihr Textview-Platzhalter ist fertig!
quelle
Ich empfehle die Verwendung des Pods 'UITextView + Platzhalter'
auf Ihrem Code
quelle
Beschriften Sie die Textansicht.
quelle
Es ist nicht möglich, einen Platzhalter in UITextView zu erstellen, aber Sie können dadurch einen Effekt wie einen Platzhalter erzeugen.
ODER Sie können Beschriftungen in der Textansicht genau wie hinzufügen
und setzen
quelle
Dies ahmt den Platzhalter von UITextField perfekt nach, wobei der Platzhaltertext so lange erhalten bleibt, bis Sie tatsächlich etwas eingeben.
quelle
Hier ist noch eine andere Möglichkeit, die die leichte Einrückung des
UITextField
Platzhalters reproduziert :Ziehen Sie eine
UITextField
rechte unter die,UITextView
so dass ihre oberen linken Ecken ausgerichtet sind. Fügen Sie Ihren Platzhaltertext zum Textfeld hinzu.Fügen Sie in viewDidLoad Folgendes hinzu:
Dann füge hinzu:
quelle
Machen wir es uns einfach
Erstellen Sie ein UILabel und platzieren Sie es in Ihrer Textansicht (Geben Sie den Text als Platzhalter-festgelegte Farbe grau an - Sie können dies alles in Ihrer xib tun). Jetzt deklarieren Sie in Ihrer Header-Datei das UILabel und auch das textviewDelegate. Jetzt können Sie die Beschriftung einfach ausblenden wenn Sie auf die Textansicht klicken
vollständiger Code unten
Header
Implementierung
@Ende
Vergessen Sie nicht, textView und UILabel von xib aus mit dem Dateibesitzer zu verbinden
quelle
Schauen Sie sich UTPlaceholderTextView an .
Dies ist eine praktische Unterklasse von UITextView, die Platzhalter unterstützt, die denen von UITextField ähneln. Hauptbesonderheiten:
quelle
Ich habe all dies durchgelesen, aber eine sehr kurze Swift 3-Lösung gefunden, die in all meinen Tests funktioniert hat. Es könnte etwas allgemeiner sein, aber der Prozess ist einfach. Hier ist die ganze Sache, die ich "TextViewWithPlaceholder" nenne.
quelle
layoutSubviews()
direkt anrufen . Und Sie haben den NotificationCenter-Beobachter nicht entfernt.Ich habe schnell eine Klasse geschrieben. Sie können diese Klasse bei Bedarf importieren.
öffentliche Klasse CustomTextView: UITextView {
}}
quelle