Wie erstelle ich ein mehrzeiliges UITextfeld?

259

Ich entwickle eine Anwendung, in der der Benutzer einige Informationen schreiben muss. Zu diesem Zweck benötige ich eine UITextFieldmehrzeilige (im Allgemeinen UITextFieldeine einzeilige).

Als ich googeln ich eine Antwort der Verwendung finden UITextViewstatt UITextfieldfür diesen Zweck.

raaz
quelle
Hier ist das kleine Steuerelement, das ich genau für diesen Zweck geschrieben habe. Es bietet mehrzeilige Unterstützung und die Schaltfläche Fertig zum Schließen der Tastatur. Fühlen Sie sich frei, es zu verwenden code.google.com/p/galtextfield
Gal Blank
2
Verwenden Sie diese Klassen von Drittanbietern, importieren Sie Ihr Xcode-Projekt und verwenden Sie es. Der Link funktioniert zu gut: github.com/adonoho/HPGrowingTextView
Mahesh Chowdary

Antworten:

435

UITextField ist speziell nur einzeilig.

Ihre Google-Suche ist korrekt. Sie müssen sie UITextViewanstelle der UITextFieldAnzeige und Bearbeitung von mehrzeiligem Text verwenden.

Fügen UITextViewSie im Interface Builder ein beliebiges hinzu und aktivieren Sie das Kontrollkästchen "Bearbeitbar". Es wird standardmäßig mehrzeilig sein.

h4xxr
quelle
7
Sagen Sie mir bitte, wie die native Kalender-App die Ansicht mit Platzhalter und Zeilenumbruch für Notizen auf dem Bildschirm zum Hinzufügen von Ereignissen erstellt.
Gennadiy Ryabkin
3
Wie setze ich einen Platzhalter für UITextView?
Mani
4
Sie können TextView keinen Platzhalter hinzufügen, aber Sie können TextView eine graue Beschriftung hinzufügen und diese ausblenden, wenn der Benutzer Text eingibt.
Andrew Romanov
Kann mir bitte jemand bei folgender Frage helfen? Wenn der Benutzer Text mit Aufzählungszeichen (mehrere Zeilenumbrüche) in UITextView schreibt, wie kann die Gesamtzahl der Zeilenumbrüche ermittelt werden?
Markus
@ Markus sollten Sie eine neue Frage dafür öffnen
Nathan F.
20

Sie können ein UITextField mit UITextView fälschen. Das Problem ist, dass Sie die Platzhalterfunktionalität verlieren.

Wenn Sie eine UITextView verwenden und den Platzhalter benötigen, gehen Sie folgendermaßen vor:

Stellen Sie in Ihrer viewDidLoad Farbe und Text auf Platzhalter ein:

myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."

Lassen Sie dann den Platzhalter verschwinden, wenn Ihre UITextView ausgewählt ist:

func textViewDidBeginEditing (textView: UITextView) {
    if myTxtView.textColor.textColor == ph_TextColor && myTxtView.isFirstResponder() {
        myTxtView.text = nil
        myTxtView.textColor = .white
    }
}

Stellen Sie nach Abschluss der Bearbeitung sicher, dass ein Wert vorhanden ist. Wenn dies nicht der Fall ist, fügen Sie den Platzhalter erneut hinzu:

func textViewDidEndEditing (textView: UITextView) {
    if myTxtView.text.isEmpty || myTxtView.text == "" {
        myTxtView.textColor = .lightGray
        myTxtView.text = "Type your thoughts here..."
    }
}

Weitere Funktionen, die Sie möglicherweise fälschen müssen:

UITextFields schreiben häufig jeden Buchstaben groß. Sie können diese Funktion zu UITableView hinzufügen:

myTxtView.autocapitalizationType = .words

UITextFields scrollen normalerweise nicht:

myTxtView.scrollEnabled = false
Dave G.
quelle
18

Ok, ich habe es mit einem Trick gemacht;) Erst baue ein UITextFieldund erhöhe es sizewie folgt:

CGRect frameRect = textField.frame;
        frameRect.size.height = 53;
        textField.frame = frameRect;

Dann baue ein UITextViewgenau in dem Bereich, in dem du mein gemacht hast UITextField, und lösche es background color. Jetzt sieht es so aus, als hättest du mehrere Zeilen TextField!

Rudi
quelle
2
Ich habe das automatische Layout verwendet und alle Seiten des UITextField an die UITextView geheftet. Wirklich toller Trick, danke!
Phatmann
Bitte @phantmann, können Sie uns Ihren Code für das automatische Layout zeigen?
Esteve
8
Dies schafft eine UITextView. Der Sinn eines UITextField besteht darin, dass es sich anders verhält als ein UITextView.
Nate Symer
2
Es gibt eine Reihe von Unterschieden zwischen UITextViewund UITextfield: Sie erben von UIScrollViewvs UIControl, standardmäßig nicht bearbeitbar vs. standardmäßig bearbeitbar, mehrzeilig vs. einzeilig, verschiedene Delegatenprotokolle, kein Platzhalter vs. Platzhalter.
Sam Ballantyne
UITextViewist für Absätze von Text. Verwenden Sie es, wenn Sie einen Textabschnitt benötigen, und nicht anders.
Sam Ballantyne
9

Abgesehen vom mehrzeiligen Verhalten besteht der Hauptunterschied zwischen UITextView und UITextField darin, dass UITextView keinen Platzhalter vorschlägt. Um diese Einschränkung zu umgehen, können Sie eine UITextView mit einem "gefälschten Platzhalter" verwenden.

Weitere Informationen finden Sie in dieser SO-Frage: Platzhalter in UITextView .

MonsieurDart
quelle
2

Wenn Sie ein UITextField mit 2 Textzeilen benötigen, können Sie ein UILabel als Unteransicht des UITextField für die zweite Textzeile hinzufügen. Ich habe ein UITextField in meiner App, von dem Benutzer häufig nicht wissen, dass es durch Tippen bearbeitet werden kann, und ich wollte dem UITextField einen kleinen Untertiteltext mit der Aufschrift "Zum Bearbeiten tippen" hinzufügen.

CGFloat tapLlblHeight = 10;
UILabel *tapEditLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, textField.frame.size.height - tapLlblHeight - 2, 70, tapLlblHeight)];
tapEditLbl.backgroundColor = [UIColor clearColor];
tapEditLbl.textColor = [UIColor whiteColor];
tapEditLbl.text = @"Tap to Edit";

[textField addSubview:tapEditLbl];
DiscDev
quelle
2

Ja, ein UITextView ist das, wonach Sie suchen. Sie müssen einige Dinge anders behandeln (wie die Eingabetaste), aber Sie können Text hinzufügen, und Sie können nach oben und unten scrollen, wenn zu viel Text darin enthalten ist.

Dieser Link enthält Informationen zum Erstellen eines Bildschirms zur Dateneingabe:

Erstellen Sie einen Dateneingabebildschirm

Nevan König
quelle
1

Verwenden Sie UITextView anstelle von UITextField

Monir Khlaf
quelle
0

Als Ergänzung zur obigen Antwort von h4xxr können Sie die Höhe des UITextFields einfacher anpassen, indem Sie im Attributinspektor-> Textfeld den quadratischen Rahmenstil auswählen. (Standardmäßig ist der Rahmenstil eines UITextfelds Ellipse.)

Referenz: Brian hier beantwortet: Wie stelle ich die UITextField-Höhe ein?

Tony
quelle
-1

Es gibt noch eine andere Option, die für mich funktioniert hat:

Unterklasse UITextField und überschreiben:

- (void)drawTextInRect:(CGRect)rect

In dieser Methode können Sie zum Beispiel:

    NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                  NSForegroundColorAttributeName : self.textColor };

    [self.text drawInRect:verticalAlignedRect withAttributes:attributes];

Dieser Code rendert den Text mit so vielen Zeilen wie erforderlich, wenn der Rect genügend Platz hat. Sie können je nach Bedarf jedes andere Attribut angeben.

Verwende nicht:

self.defaultTextAttributes

Dadurch wird das Rendern von einzeiligem Text erzwungen

McFlys
quelle