Jak utworzyć wielowierszowe pole UIT?


259

Tworzę aplikację, w której użytkownik musi napisać jakieś informacje. W tym celu potrzebuję UITextFieldlinii wieloliniowej (ogólnie UITextFieldjest to pojedyncza linia).

Gdy korzystam z Googlinga, znajduję odpowiedź dotyczącą użycia UITextViewzamiast tego UITextfielddo tego celu.


Oto mała kontrola, którą napisałem właśnie w tym celu. ma wsparcie dla wielu linii, a także przycisk Gotowe do zamykania klawiatury. skorzystaj z niego code.google.com/p/galtextfield
— Gal Blank

2
skorzystaj z tych zewnętrznych klas, zaimportuj swój projekt xcode i użyj go, jego działa zbyt dobry link: github.com/adonoho/HPGrowingTextView
— mahesh chowdary

Odpowiedzi:


435

UITextField jest konkretnie tylko jednowierszowy.

Twoje wyszukiwanie w Google jest prawidłowe, musisz użyć UITextViewzamiast UITextFielddo wyświetlania i edycji tekstu wielowierszowego.

W Konstruktorze interfejsów dodaj UITextViewżądane miejsce i zaznacz pole „edytowalne”. Domyślnie będzie wielowierszowy.


7
Więc powiedz mi proszę, jak natywna aplikacja kalendarza sprawia, że ​​widok zawiera symbol zastępczy i zawijanie słów dla notatek na ekranie dodawania wydarzenia?
— Gennadiy Ryabkin

3
jak ustawić symbol zastępczy dla UITextView?
— Mani

4
Nie możesz dodać symbolu zastępczego do TextView, ale możesz dodać szarą etykietę nad TextView i ukryć ją, jeśli użytkownik wprowadzi jakiś tekst.
— Andrew Romanov,

Czy ktoś może mi pomóc z następującym pytaniem? Jeśli użytkownik zapisuje wypunktowany tekst (wiele podziałów linii) w UITextView, jak wykryć całkowitą liczbę podziałów linii?
— Markus

@Markus powinieneś otworzyć nowe pytanie w tej sprawie
— Nathan F.,

20

Możesz sfałszować UITextField za pomocą UITextView. Problem, który będziesz miał, polega na tym, że tracisz funkcję zastępcy.

Jeśli zdecydujesz się użyć UITextView i potrzebujesz symbolu zastępczego, wykonaj następujące czynności:

W twoim widokuDidLoad ustaw kolor i tekst na symbole zastępcze:

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

Następnie spraw, aby symbol zastępczy zniknął po wybraniu UITextView:

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

Gdy użytkownik zakończy edycję, upewnij się, że istnieje wartość. Jeśli nie, dodaj ponownie symbol zastępczy:

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

Inne funkcje, które mogą być konieczne do sfałszowania:

UITextField często pisze wielką literą każdą literę, możesz dodać tę funkcję do UITableView:

myTxtView.autocapitalizationType = .words

Pola UITextField zwykle nie przewijają się:

myTxtView.scrollEnabled = false

18

Ok, zrobiłem to z jakąś sztuczką;) Najpierw zbuduj UITextFieldi zwiększono to sizetak:

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

Następnie zbuduj UITextViewdokładnie w tym samym obszarze, w którym utworzyłeś mój UITextField, i usuń go background color. Teraz wygląda na to, że masz wiele linii TextField!


2
Użyłem automatycznego układu i przypiąłem wszystkie strony UITextField do UITextView. Naprawdę świetna sztuczka, dzięki!
— phatmann

proszę @phantmann, czy możesz nam pokazać swój kod do automatycznego układu?
— Esteve

8
To tworzy UITextView. Chodzi o to, aby UITextField zachowywał się inaczej niż a UITextView.
— Nate Symer,

2
Istnieje kilka różnic między UITextViewi UITextfield: dziedziczą z UIScrollViewvs UIControl, domyślnie nie można edytować domyślnie vs. domyślnie można edytować, multilinii vs. jednowierszowe, różne protokoły delegowania, brak symboli zastępczych vs. symbol zastępczy.
— Sam Ballantyne,

UITextViewdotyczy akapitów tekstu. Użyj go, jeśli potrzebujesz akapitu tekstu, a nie inaczej.
— Sam Ballantyne,

9

Oprócz zachowania wielu linii główna różnica między UITextView a UITextField polega na tym, że UITextView nie proponuje symbolu zastępczego. Aby ominąć to ograniczenie, możesz użyć UITextView z „fałszywym symbolem zastępczym”.

Zobacz to pytanie SO, aby uzyskać szczegółowe informacje: Symbol zastępczy w UITextView .


2

Jeśli musisz mieć pole UITextField z 2 wierszami tekstu, jedną z opcji jest dodanie UILabel jako widoku podrzędnego pola UITextField dla drugiego wiersza tekstu. Mam w swojej aplikacji UITextField, którego użytkownicy często nie zdają sobie sprawy, że można go edytować, dotykając, i chciałem dodać do napisu UITextField mały tekst napisów z napisem „Stuknij, aby edytować”.

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];

2

Tak, UITextView jest tym, czego szukasz. Będziesz musiał poradzić sobie z niektórymi rzeczami inaczej (np. Klawisz powrotu), ale możesz dodać do niego tekst, a to pozwoli ci przewijać w górę i w dół, jeśli w środku jest za dużo tekstu.

Ten link zawiera informacje o tworzeniu ekranu do wprowadzania danych:

utwórz ekran wprowadzania danych



0

Uzupełnieniem powyższej odpowiedzi h4xxr, łatwiejszym sposobem dostosowania wysokości pola UITextField jest wybranie stylu kwadratowej ramki w inspektorze atrybutu-> Pole tekstowe. (Domyślnie stylem ramki pola UIT jest elipsa).

Odniesienie: Odpowiedział Brian tutaj: Jak ustawić wysokość pola UITextField?


-1

Jest dla mnie inna opcja:

Podklasa UITextField i nadpisywanie:

- (void)drawTextInRect:(CGRect)rect

W tej metodzie możesz na przykład:

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

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

Ten kod wyrenderuje tekst przy użyciu tylu wierszy, ile jest wymaganych, jeśli prostokąt ma wystarczającą ilość miejsca. Możesz określić dowolny inny atrybut w zależności od potrzeb.

Nie używać:

self.defaultTextAttributes

co wymusi renderowanie tekstu w jednej linii

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.