Як створити багаторядковий UITextfield?


259

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

Оскільки я гуглінг, я знаходжу відповідь щодо використання UITextViewзамість UITextfieldцього.


Ось маленький контроль, який я написав саме для цієї мети. У ньому є багатолінійна підтримка, а також кнопка Готово для закриття клавіатури. сміливо
Гал Бланк

2
скористайтеся цим стороннім класом імпортуйте ваш проект xcode та використовуйте його, його надто гарне посилання: github.com/adonoho/HPGrowingTextView
mahesh chowdary

Відповіді:


435

UITextField спеціально однолінійний.

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

У програмі Interface Builder додайте UITextViewпотрібне місце та виберіть поле "для редагування". За замовчуванням це буде багаторядковий.


7
Тож скажіть, будь ласка, як нативна програма календаря робить Перегляд із заповненням заповнення та перенесенням текстів для приміток на екрані, що додає події?
Геннадій Рябкін

3
як встановити заповнювач для UITextView?
Мані

4
Ви не можете додати заповнювача до TextView, але ви можете додати сіру мітку над TextView і приховати її, якщо користувач введе якийсь текст.
Андрій Романов

Будь ласка, будь-хто може допомогти мені у наступному питанні? Якщо користувач пише буклетний текст (кілька розривів рядків) в UITextView, як виявити загальну кількість розривів рядків?
Маркус

@Markus, ви повинні відкрити нове питання для цього
Натан Ф.

20

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

Якщо ви вирішили використовувати UITextView і вам потрібен заповнювач, зробіть це:

У вашому переглядіDidLoad встановіть колір та текст на заповнювачі:

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!


2
Я використовував автоматичний макет і закріплював усі сторони UITextField до UITextView. Дійсно чудова хитрість, дякую!
phatmann

будь ласка, @phantmann, чи можете ви показати нам свій код для автоматичного макета?
Esteve

8
Це створює a UITextView. Сенс створення UITextField полягає в тому, що він поводиться інакше, ніж a UITextView.
Нейт Симер

2
Існує маса відмінностей між : UITextViewта UITextfield: вони успадковують від UIScrollViewvs UIControl, не для редагування за замовчуванням проти редагованих за замовчуванням, багаторядкових проти однорядкових, різних протоколів делегування, не-заповнювача проти заповнювача.
Сем Баллантин

UITextViewпризначено для абзаців тексту. Використовуйте його, якщо вам потрібен абзац тексту, а не інакше.
Сем Баллантайн

9

Крім поведінки в декількох рядках, головна відмінність UITextView від UITextField полягає в тому, що UITextView не пропонує заповнювача. Щоб обійти це обмеження, ви можете використовувати UITextView з "підробленим заповнювачем місця".

Докладні відомості див. У цьому запитанні ТА : Заповнювач місця в UITextView .


2

Якщо у вас повинно бути поле UITextField з 2 рядками тексту, одним із варіантів є додавання 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];

2

Так, ви шукаєте UITextView. Вам доведеться вирішувати деякі речі по-різному (наприклад, ключ повернення), але ви можете додати текст до нього, і це дозволить вам прокручувати вгору і вниз, якщо всередині занадто багато тексту.

На цьому посиланні є інформація про створення екрана для введення даних:

створити екран введення даних



0

Доповненням до відповіді h4xxr у вищесказаному, простішим способом регулювання висоти поля UITextField є вибір стилю квадратної межі в атрибуті інспекторів-> Текстове поле. (За замовчуванням стиль межі UITextfield - це еліпс.)

Довідка: Відповів Брайан тут: Як встановити висоту UITextField?


-1

Є ще один варіант, який працював для мене:

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

- (void)drawTextInRect:(CGRect)rect

У цьому методі ви можете, наприклад:

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

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

Цей код буде виводити текст, використовуючи стільки рядків, скільки потрібно, якщо у прямої є достатньо місця. Ви можете вказати будь-який інший атрибут залежно від ваших потреб.

Не використовувати:

self.defaultTextAttributes

що змусить вивести один рядок тексту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.