Как создать многострочное UITextfield?

259

Я разрабатываю приложение, в котором пользователь должен написать некоторую информацию. Для этого мне нужна UITextFieldмногострочная (в общем UITextFieldслучае одна строка).

Поскольку я гуглюсь, я нахожу ответ, используя UITextViewвместо этого UITextfieldдля этой цели.

Raaz
источник
Вот небольшой контроль, который я написал именно для этой цели. имеет многострочную поддержку, а также кнопку «Готово» для закрытия клавиатуры. не стесняйтесь использовать его code.google.com/p/galtextfield
Гал Бланк
2
используйте эти сторонние классы, импортируйте ваш проект xcode и используйте его, его работающая слишком хорошая ссылка: github.com/adonoho/HPGrowingTextView
mahesh chowdary

Ответы:

435

UITextField конкретно только в одну строку.

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

В Интерфейсном Разработчике добавьте, UITextViewгде вы хотите, и установите флажок «редактируемый». Это будет многострочным по умолчанию.

h4xxr
источник
7
Расскажите, пожалуйста, как собственное приложение Календарь делает View с заполнителем и переносом слов для заметок на экране добавления событий?
Геннадий Рябкин
3
Как установить заполнитель для UITextView?
Мани,
4
Вы не можете добавить заполнитель в TextView, но вы можете добавить серую метку поверх TextView и скрыть ее, если пользователь вводит какой-либо текст.
Андрей Романов
Пожалуйста, кто-нибудь может мне помочь со следующим вопросом? Если пользователь пишет маркированный текст (несколько разрывов строк) в UITextView, как определить общее количество разрывов строк?
Маркус
@Markus, для этого тебе следует открыть новый вопрос
Натан Ф.
20

Вы можете подделать UITextField с помощью UITextView. Проблема, с которой вы столкнетесь, заключается в том, что вы потеряете функциональность заполнителя.

Если вы решили использовать UITextView и вам нужен заполнитель, сделайте это:

В вашем viewDidLoad установите цвет и текст для заполнителей:

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

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

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

Когда пользователь закончит редактирование, убедитесь, что есть значение. Если нет, добавьте заполнитель снова:

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

Другие функции, которые могут вам понадобиться, чтобы подделать:

UITextField часто использует заглавные буквы для каждой буквы, вы можете добавить эту функцию в UITableView:

myTxtView.autocapitalizationType = .words

UITextField обычно не прокручивается:

myTxtView.scrollEnabled = false
Дэйв Дж
источник
18

Хорошо, я сделал это с помощью некоторого трюка;) Сначала соберите UITextFieldи увеличьте это sizeтак:

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

Затем создайте UITextViewточно в той же области, что и мой UITextField, и удалите его background color. Теперь похоже, что у вас есть несколько строк TextField!

Rudi
источник
2
Я использовал автоматическое расположение и закрепил все стороны UITextField в UITextView. Действительно отличный трюк, спасибо!
phatmann
пожалуйста @phantmann, можете ли вы показать нам свой код для автоматического макета?
Esteve
8
Это создает UITextView. Смысл наличия UITextField в том, что он ведет себя иначе, чем a UITextView.
Нейт Симер
2
Существует множество различий между UITextViewи UITextfield: они наследуются от UIScrollViewvs UIControl, не редактируемые по умолчанию и не редактируемые по умолчанию, многострочные и однострочные, разные протоколы делегирования, не заполнитель и заполнитель.
Сэм Баллантайн
UITextViewдля абзацев текста. Используйте его, если вам нужен абзац текста, а не иначе.
Сэм Баллантайн
9

Помимо многострочного поведения, основное различие между UITextView и UITextField состоит в том, что UITextView не предлагает заполнитель. Чтобы обойти это ограничение, вы можете использовать UITextView с «поддельным заполнителем».

Смотрите этот SO вопрос для деталей: Заполнитель в UITextView .

MonsieurDart
источник
2

Если у вас должен быть UITextField с двумя строками текста, один из вариантов - добавить UILabel в качестве подпредставления UITextField для второй строки текста. В моем приложении есть UITextField, который пользователи часто не понимают, можно ли редактировать нажатием, и я хотел добавить небольшой текст субтитров с надписью «Нажмите, чтобы изменить» в 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];
DiscDev
источник
2

Да, UITextView - это то, что вы ищете. Вам придется иметь дело с некоторыми вещами по-разному (например, клавиша возврата), но вы можете добавить к нему текст, и он позволит вам прокручивать вверх и вниз, если внутри слишком много текста.

Эта ссылка содержит информацию о создании экрана для ввода данных:

создать экран ввода данных

Неван Кинг
источник
1

использовать UITextView вместо UITextField

Монир Хлаф
источник
0

В дополнение к ответу h4xxr выше, более простой способ отрегулировать высоту UITextField - выбрать стиль квадратной границы в атрибуте inspectors-> Text Field. (По умолчанию стиль рамки поля UIText - эллипс.)

Ссылка: ответил Брайан здесь: Как установить высоту UITextField?

Тони
источник
-1

Есть еще один вариант, который работал для меня:

Подкласс UITextField и перезаписать:

- (void)drawTextInRect:(CGRect)rect

В этом методе вы можете, например:

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

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

Этот код будет отображать текст, используя столько строк, сколько требуется, если в прямоугольнике достаточно места. Вы можете указать любой другой атрибут в зависимости от ваших потребностей.

Не используй:

self.defaultTextAttributes

который заставит одну строку рендеринга текста

McFlys
источник