Jak utworzyć multiline UITextfield?

Rozwijam aplikację, w której użytkownik musi napisać kilka informacji. W tym celu potrzebuję UITextField, która jest wielowierszowa (ogólnie UITextField jest pojedynczą linią).

Podczas googlowania znajduję odpowiedź na użycie UITextView zamiast UITextfield w tym celu.

Author: Juan Boero, 2009-08-28

9 answers

UITextField jest tylko jednolinijkowy.

Twoje wyszukiwanie w Google jest poprawne, musisz użyć UITextView zamiast UITextField do wyświetlania i edycji tekstu wielowierszowego.

W Interface Builder dodaj UITextView tam, gdzie chcesz i wybierz pole "edytowalne". Domyślnie będzie to Wielowierszowe.

 390
Author: h4xxr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 14:08:41

Ok zrobiłem to jakimś trickiem ;) najpierw zbuduj UITextField i zwiększ tosize Tak:

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

Następnie zbudować UITextView dokładnie w tym samym obszarze, który u wykonane my UITextField, i usunięte jego background color. Teraz wygląda na to, że u ma wiele linii TextField !

 21
Author: Rudi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-10 10:11:12

Możesz sfałszować UITextField używając UITextView. Problem, który będziesz miał polega na tym, że stracisz funkcjonalność posiadacza miejsca.

Jeśli zdecydujesz się użyć UITextView i potrzebujesz symbolu zastępczego, zrób to:

W twoim viewDidLoad Ustaw kolor i tekst na symbole zastępcze:

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

Następnie upewnij się, że symbol zastępczy zniknie, gdy UITextView jest zaznaczony:

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 ma, Dodaj symbol zastępczy znowu:

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ć potrzebne do fałszowania:

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

myTxtView.autocapitalizationType = .words

UITextField zwykle nie przewija:

myTxtView.scrollEnabled = false
 10
Author: Dave G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 21:49:22

Poza zachowaniem wielu linii, główną różnicą między UITextView i UITextField jest to, że UITextView nie proponuje elementu zastępczego. Aby ominąć to ograniczenie, możesz użyć UITextView z " fałszywym symbolem zastępczym."

Zobacz to pytanie po szczegóły: Placeholder w UITextView .

 7
Author: MonsieurDart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:27

Tak, UITextView jest tym, czego szukasz. Będziesz musiał radzić sobie z niektórymi rzeczami inaczej (jak Klawisz Powrotu), ale możesz dodać do niego tekst, który pozwoli Ci przewijać w górę iw dół, jeśli w środku jest za dużo tekstu.

Ten link zawiera informacje o tworzeniu ekranu do wprowadzania danych:

Tworzenie ekranu wprowadzania danych

 2
Author: nevan king,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-20 07:24:38

Jeśli musisz mieć pole UITextField z 2 wierszami tekstu, jedną z opcji jest dodanie etykiety UILabel jako podglądu pola UITextField dla drugiej linii tekstu. Mam UITextField w mojej aplikacji, że użytkownicy często nie zdają sobie sprawy, jest edytowalny przez dotknięcie, i chciałem dodać kilka małych napisów tekst, który mówi "Dotknij, aby edytować" do UITextField.

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];
 1
Author: DiscDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 18:35:08

Uzupełnieniem powyższej odpowiedzi h4xxr, łatwiejszym sposobem dostosowania wysokości pola UITextField jest wybranie kwadratowego stylu obramowania w polu atrybut->Text. (Domyślnie styl obramowania pola UITextfield to elipsa.)

Reference: Jak ustawić wysokość UITextField?

 0
Author: Tony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

Użyj UITextView zamiast UITextField

 0
Author: Monir Khlaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-23 20:39:31

Jest jeszcze jedna opcja, która zadziałała dla mnie:

Podklasa UITextField i nadpisanie:

- (void)drawTextInRect:(CGRect)rect

W tej metodzie można na przykład:

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

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

Ten kod wyrenderuje tekst z dowolną liczbą wierszy, jeśli rect ma wystarczająco dużo miejsca. Możesz określić dowolny inny atrybut w zależności od potrzeb.

Nie stosować:

self.defaultTextAttributes

Który wymusi renderowanie tekstu w jednej linii

 -2
Author: McFlys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 16:35:36