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.

raaz
źródło
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.

h4xxr
źródło
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
Dave G.
źródło
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!

Rudi
źródło
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 .

MonsieurDart
źródło
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];
DiscDev
źródło
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

Nevan King
źródło
1

użyj UITextView zamiast UITextField

Monir Khlaf
źródło
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?

Tony
źródło
-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

McFlys
źródło