Мое приложение использует UITextView
. Теперь я хочу UITextView
иметь заполнитель, похожий на тот, который вы можете установить для UITextField
.
Как это сделать?
ios
objective-c
cocoa-touch
uitextview
placeholder
user142019
источник
источник
UITextView
решение становится совсем другим. Вот пара решений. Плавающий Заполнитель и Поддельные Местные ЗаполнителиОтветы:
Я внес несколько незначительных изменений в решение bcd, чтобы обеспечить инициализацию из
Xib
файла, перенос текста и сохранение цвета фона. Надеюсь, это спасет других от неприятностей.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
источник
Простой способ, просто создать текст-заполнитель
UITextView
, используя следующиеUITextViewDelegate
методы:просто не забудьте указать
myUITextView
точный текст при создании, напримери сделать родительский класс,
UITextViewDelegate
прежде чем включать эти методы, напримерКод для Swift 3.1
просто не забудьте указать
myUITextView
точный текст при создании, напримери сделать родительский класс,
UITextViewDelegate
прежде чем включать эти методы, напримеристочник
text
вмешивается в атрибут textview, что довольно приятно ... в то время как этот метод его модифицируетЯ не был слишком доволен ни одним из опубликованных решений, поскольку они были немного тяжелыми. Добавление представлений к представлению не очень идеально (особенно в
drawRect:
). У них обоих были утечки, что тоже неприемлемо.Вот мое решение: SAMTextView
SAMTextView.h
SAMTextView.m
Это намного проще, чем другие, так как не использует подпредставления (или не имеет утечек). Не стесняйтесь использовать его.
Обновление 11/10/11: теперь оно задокументировано и поддерживает использование в Интерфейсном Разработчике.
Обновление 24.11.13: Укажите новый репо.
источник
setText
чтобы также обновлять местозаполнитель при программном изменении свойства текста: - (void) setText: (NSString *) string {[super setText: string]; [self _updateShouldDrawPlaceholder]; }notification
в последнем методе аргумент написан с ошибкой, и это слишком маленькое изменение, чтобы отправить его в качестве редактирования.Я нашел себе очень простой способ подражать местозаполнителю
Редактировать:
Изменены операторы if для сравнения тегов, а не текста. Если пользователь удалил свой текст, можно было также случайно удалить часть заполнителя.
@"Foobar placeholder"
Это означало, что если пользователь повторно ввел textView следующим методом делегирования-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
, он не будет работать должным образом . Я попытался сравнить по цвету текста в операторе if, но обнаружил, что светло-серый цвет, установленный в конструкторе интерфейса, не совпадает со светло-серым цветом, установленным в коде с[UIColor lightGreyColor]
Также возможно сбросить заполнитель текста, когда клавиатура вернется и [textView length] == 0
РЕДАКТИРОВАТЬ:
Просто, чтобы сделать последнюю часть более понятной - вот как вы можете вернуть текст заполнителя:
источник
Что вы можете сделать, это настроить текстовое представление с некоторым начальным значением в
text
свойстве и изменитьtextColor
его[UIColor grayColor]
или что-то подобное. Затем, когда текстовое представление становится редактируемым, очистите текст и представьте курсор, а если текстовое поле снова когда-либо снова станет пустым, верните текст-заполнитель обратно. Измените цвет на[UIColor blackColor]
соответствующий.Это не совсем то же самое, что функциональность заполнителя в UITextField, но это близко.
источник
Вы можете установить ярлык на
UITextView
пои скрыть это по
TextViewdidChange
методу.Это простой и легкий способ.
источник
Если кому-то нужно решение для Swift:
Добавьте UITextViewDelegate в свой класс
источник
Простое решение Swift 3
Добавить
UITextViewDelegate
в свой классНабор
yourTextView.delegate = self
Создайте
placeholderLabel
и разместите его внутриyourTextView
Теперь просто анимируйте
placeholderLabel.alpha
наtextViewDidChange
:вам, возможно, придется поиграть с
placeholderLabel
позицией, чтобы настроить ее правильно, но это не должно быть слишком сложноисточник
let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
Я расширил ответ KmKndy, чтобы заполнитель оставался видимым до тех пор, пока пользователь не начнет редактировать,
UITextView
а не просто нажмет на него. Это отражает функциональность приложений Twitter и Facebook. Мое решение не требует подкласса и работает, если пользователь вводит текст напрямую или вставляет текст!просто не забудьте установить myUITextView с точным текстом при создании, например
и сделать родительский класс делегатом UITextView перед включением этих методов, например
источник
Я рекомендую использовать
SZTextView
.https://github.com/glaszig/SZTextView
Добавьте значение по умолчанию
UITextView
из,storyboard
а затем измените его пользовательский класс,SZTextView
как показано ниже 👇👇👇👇Тогда вы увидите два новых варианта в
Attribute Inspector
👇👇👇👇источник
Ниже приведен порт Swift кода ObjC «SAMTextView», опубликованный в качестве одного из первых нескольких ответов на вопрос. Я протестировал его на iOS 8. Я подправил несколько вещей, включая смещение границ для размещения текста заполнителя, так как оригинал был слишком высоким и слишком правым (использовал предложение в одном из комментариев к этому посту).
Я знаю, что есть много простых решений, но мне нравится подход создания подклассов UITextView, потому что он многократно используется, и мне не нужно загромождать классы, используя его с механизмами.
Swift 2.2:
Swift 4.2:
источник
вот как я это сделал:
UITextView2.h
UITextView2.m
источник
Вот более простое решение, которое ведет себя точно так же, как местозаполнитель UITextField, но не требует рисования пользовательских представлений или отставки первого респондента.
(вторая проверка в операторе else if относится к случаю, когда ничего не вводится и пользователь нажимает клавишу Backspace)
Просто установите свой класс как UITextViewDelegate. В viewDidLoad вы должны инициализировать как
источник
Привет, вы можете использовать IQTextView, доступный в IQKeyboard Manager, его просто использовать и интегрировать, просто установите класс вашего текстового представления в IQTextView, и вы можете использовать его свойство для установки метки-заполнителя нужного цвета. Вы можете скачать библиотеку из IQKeyboardManager
или вы можете установить его из cocoapods.
источник
UITextViewDelegate
работало отличноИзвините, что добавил еще один ответ, но я просто вытащил что-то вроде этого, и это создало тип заполнителя, ближайший к UITextField.
Надеюсь, это кому-нибудь поможет.
источник
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
В противном случае первый символ, вводимый в текстовое представление, был помещен в конец текстаПростой способ использовать это в некоторой строке кода:
Возьмите одну метку до UITextView в .nib, соединяя эту метку с вашим кодом, после него.
источник
Я изменил реализацию Сэма Соффеса для работы с iOS7:
Не забудьте установить
_placeholderAttribues = nil
методы, которые могут изменить шрифт и другие теги, которые могут повлиять на них. Вы также можете пропустить «ленивое» создание словаря атрибутов, если это вас не беспокоит.РЕДАКТИРОВАТЬ:
Не забывайте вызывать setNeedsDisplay в переопределенной версии setBounds, если вы хотите, чтобы заполнитель хорошо выглядел после анимации с разметкой и тому подобного.
источник
Вы также можете создать новый класс TextViewWithPlaceholder в качестве подкласса UITextView.
(Этот код довольно грубый, но я думаю, что он на правильном пути.)
Добавьте в свой делегат это:
источник
Я сделал свою собственную версию подкласса 'UITextView'. Мне понравилась идея Сэма Соффса об использовании уведомлений, но мне не понравился drawRect: overwrite. Кажется излишним для меня. Я думаю, что я сделал очень чистую реализацию.
Вы можете посмотреть на мой подкласс здесь . Демо-проект также включен.
источник
В этой теме было много ответов, но вот версия, которую я предпочитаю.
Он расширяет существующий
UITextView
класс, поэтому его легко использовать повторно, и он не перехватывает подобные событияtextViewDidChange
(которые могут нарушить код пользователя, если они уже перехватывали эти события в другом месте).Используя мой код (показанный ниже), вы можете легко добавить заполнитель к любому из ваших
UITextViews
подобных:Когда вы устанавливаете это новое значение заполнителя, оно незаметно добавляет
UILabel
верхнюю часть вашегоUITextView
, а затем скрывает / показывает его при необходимости:Хорошо, чтобы внести эти изменения, добавьте файл «UITextViewHelper.h», содержащий этот код:
... и файл UITextViewHelper.m, содержащий это:
Да, это много кода, но как только вы добавили его в свой проект и включили .h файл ...
... вы можете легко использовать заполнители в
UITextViews
.Хотя есть одна ошибка.
Если вы делаете это:
... заполнитель появится в верхней части текста. Когда вы устанавливаете
text
значение, ни одно из обычных уведомлений не вызывается, поэтому я не мог решить, как вызвать мою функцию, чтобы решить, показывать ли / скрывать заполнитель.Решение состоит в том, чтобы установить
textValue
вместоtext
:Кроме того, вы можете установить
text
значение, а затем позвонитьcheckIfNeedToDisplayPlaceholder
.Мне нравятся подобные решения, поскольку они «заполняют пробел» между тем, что Apple предоставляет нам, и тем, что нам (как разработчикам) действительно нужно в наших приложениях. Вы пишете этот код один раз, добавляете его в свою библиотеку «вспомогательных» файлов .m / .h, и со временем SDK фактически начинает становиться все менее утомительным.
(Я написал аналогичный помощник для добавления кнопки «очистить» в мои UITextViews, еще одна вещь, которая досадно существует в,
UITextField
но не вUITextView
...)источник
Сначала возьмите метку в .h файле.
Вот беру
Тогда в .m под viewDidLoad объявите это
textview - это мой TextView.
Теперь объявляю
И ваш заполнитель Textview готов!
источник
Я рекомендую использовать модуль 'UITextView + Placeholder'
в вашем коде
источник
поместите метку поверх текстового представления.
источник
Невозможно создать заполнитель в UITextView, но вы можете создать эффект как заполнитель этим.
ИЛИ вы можете добавить метку в textview так же, как
и установить
источник
Это идеально имитирует заполнитель UITextField, где текст заполнителя остается до тех пор, пока вы что-то не введете.
источник
Вот еще один способ сделать это, тот, который воспроизводит небольшой отступ в качестве
UITextField
заполнителя:Перетащите
UITextField
вправо подUITextView
так, чтобы их верхние левые углы были выровнены. Добавьте текст заполнителя в текстовое поле.В viewDidLoad добавьте:
Затем добавьте:
источник
Позволяет сделать это легко
Создайте одну UILabel и поместите ее в текстовое представление (задайте текст в виде заполнителя, установленного серым цветом, вы можете сделать все это в своей xib). Теперь в вашем заголовочном файле объявите UILabel, а также textviewDelegate. Теперь вы можете просто скрыть метку. когда вы нажимаете на текстовое представление
полный код ниже
заголовок
реализация
@конец
Не забудьте подключить textView и UILabel к владельцу файлов из xib
источник
Взгляните на UTPlaceholderTextView .
Это удобный подкласс UITextView, который поддерживает заполнитель, аналогичный UITextField. Основные особенности:
источник
Я прочитал все это, но предложил очень короткое решение Swift 3, которое сработало во всех моих тестах. Это может выдержать немного больше общности, но процесс прост. Вот все, что я называю «TextViewWithPlaceholder».
источник
layoutSubviews()
напрямую. И вы не удалили наблюдателя NotificationCenter.Я написал класс по быстрому. Вы можете импортировать этот класс при необходимости.
открытый класс CustomTextView: UITextView {
}
источник