Многострочный пользовательский ввод в iOS: UITextField vs UITextView

Мне нужно показать пользователям многострочный текстовый ввод "поле" с высотой, превышающей стандартную высоту UITextField. Какой лучший или самый правильный подход должен быть?:

  1. Использование UITextField и изменение его высоты в коде или применение определенного ограничения по высоте.
  2. Использование редактируемого UITextView. Это многострочный, но по умолчанию он не имеет местозаполнителя, я предполагаю, что я должен реализовать эту функцию в коде.

Ответ 1

UITextField - это только одна строка.

UITextView этого используйте UITextView для многострочного текста.

Чтобы внедрить заполнитель в UITextView, используйте эту логику/код.

Сначала установите UITextView, чтобы он содержал текст заполнителя и установил его на светло-серый цвет, чтобы имитировать внешний вид текста заполнителя UITextField. Либо сделайте это в viewDidLoad либо при создании текстового представления.

Для Свифта

textView.text = "Placeholder"
textView.textColor = UIColor.lightGrayColor()

Для цели-C

textView.text = @"Placeholder";
textView.textColor =[UIColor lightGrayColor];

Затем, когда пользователь начинает редактировать текстовое представление, если текстовое представление содержит местозаполнитель (т.е. Если его цвет текста светло-серый), очистите текст-заполнитель и установите цвет текста в черный для того, чтобы он соответствовал записи пользователя.

Для Свифта

func textViewDidBeginEditing(textView: UITextView) {
    if textView.textColor == UIColor.lightGrayColor() {
        textView.text = nil
        textView.textColor = UIColor.blackColor()
    }
}

Для цели-C

- (BOOL) textViewShouldBeginEditing:(UITextView *)textView
{
    if (textView.textColor == [UIColor lightGrayColor]) {
        textView.text = @"";
        textView.textColor = [UIColor blackColor];
    }

    return YES;
} 

Затем, когда пользователь заканчивает редактирование текстового вида, и он ушел в отставку в качестве первого ответчика, если текстовое представление пустое, сбросьте его заполнитель, повторно добавив текст-заполнитель и установив его цвет на светло-серый.

Для Свифта

func textViewDidEndEditing(textView: UITextView) {
    if textView.text.isEmpty {
        textView.text = "Placeholder"
        textView.textColor = UIColor.lightGrayColor()
    }
}

Для цели-C

- (void)textViewDidEndEditing:(UITextView *)textView{
    if ([textView.text isEqualToString:@""]) {
        textView.text = @"Placeholder";
        textView.textColor =[UIColor lightGrayColor];
    }
}

Ответ 2

Идите с опцией два, высота текстового поля не может быть изменена, и она не отображает вторую строку...

PLACEHOLDER LOGIC:

textView.text = "Placeholder"
textView.textColor = UIColor.lightGrayColor()

func textViewDidBeginEditing(textView: UITextView) {
    if textView.textColor == UIColor.lightGrayColor() {
        textView.text = nil
        textView.textColor = UIColor.blackColor()
    }
}
func textViewDidEndEditing(textView: UITextView) {
    if textView.text.isEmpty {
        textView.text = "Placeholder"
        textView.textColor = UIColor.lightGrayColor()
    }
}

Из текстового представления Placeholder Swift.

Ответ 3

Вы не можете делать многострочный текст, используя UITextField, вы должны пойти с UITextView и реализовать логику UITextView.

Ответ 4

Я бы определенно пошел с UITextView. Если вы хотите установить текст заполнителя, UITextView+Placeholder позволяет легко установить его. Вы можете установить его, используя

pod 'UITextView+Placeholder', '~> 1.2'

в вашем файле подкачки. Теперь вы можете импортировать заголовок

#import <UITextView+Placeholder/UITextView+Placeholder.h>

который помогает легко установить местозаполнитель.

UITextView *textView = [[UITextView alloc] init];
textView.placeholder = @"How are you?";
textView.placeholderColor = [UIColor lightGrayColor]; // optional
textView.attributedPlaceholder = ... // NSAttributedString (optional)

Ответ 5

Для Swift 3

UITextView своей природе не имеет свойства placeholder, поэтому вам нужно будет создавать и манипулировать программно, используя методы UITextViewDelegate.

(Примечание: добавьте UITextViewDelegate в класс и установите textView.delegate = self.)

Сначала установите UITextView чтобы он содержал текст заполнителя и установил его на светло-серый цвет, чтобы имитировать внешний вид UITextField заполнителя UITextField. Либо сделайте это в viewDidLoad либо при создании текстового представления.

textView.text = "Placeholder"
textView.textColor = UIColor.lightGray

Затем, когда пользователь начинает редактировать текстовое представление, если текстовое представление содержит местозаполнитель (т.е. Если его цвет текста светло-серый), очистите текст-заполнитель и установите цвет текста в черный для того, чтобы он соответствовал записи пользователя.

func textViewDidBeginEditing(_ textView: UITextView) {
    if textView.textColor == UIColor.lightGray {
        textView.text = nil
        textView.textColor = UIColor.black
    }
}

Затем, когда пользователь заканчивает редактирование текстового вида, и он ушел в отставку в качестве первого ответчика, если текстовое представление пустое, сбросьте его заполнитель, повторно добавив текст-заполнитель и установив его цвет на светло-серый.

func textViewDidEndEditing(_ textView: UITextView) {
    if textView.text.isEmpty {
        textView.text = "Placeholder"
        textView.textColor = UIColor.lightGray
    }
}