Я хотел бы, чтобы вставка в текст из UITextField
.
Это возможно?
ios
cocoa-touch
uitextfield
RunLoop
источник
источник
Ответы:
Переопределение
-textRectForBounds:
только изменит вставку текста заполнителя. Чтобы изменить вставку редактируемого текста, необходимо также переопределить-editingRectForBounds:
источник
UITextField
находится внутриUIScrollView
.- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
найдено здесь: stackoverflow.com/questions/5361369/…Я смог сделать это через:
Конечно, не забудьте импортировать QuartzCore, а также добавить Framework в ваш проект.
источник
UITextField
перекрывает содержимое с правой стороны.Если вам нужен только левый край, вы можете попробовать это:
Меня устраивает. Я надеюсь, что это может помочь.
источник
leftView.backgroundColor = textField.backgroundColor;
... Кроме этого отличного решения ... Спасибо (:В классе, производном от UITextField, переопределите по крайней мере эти два метода:
Это может быть так просто, если у вас нет дополнительного контента:
UITextField предоставляет несколько методов позиционирования, которые вы можете переопределить.
источник
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Как насчет
@IBInspectable
,@IBDesignable
стремительный класс.Вы увидите это в своей раскадровке.
Обновление - Swift 3
источник
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
textRect
/editingRect
) влияет на производительность прокрутки (по крайней мере, на iOS 12), когда текст выходит за видимый прямоугольник. При вставке 15 он даже перестает прокручиваться.Если у вас есть кнопка очистки, принятый ответ не будет работать для вас. Мы также должны остерегаться того, чтобы Apple изменила ситуацию в будущем, позвонив по телефону
super
.Итак, чтобы убедиться, что текст не перекрывает кнопку очистки, давайте
super
сначала получим значение «по умолчанию» , а затем скорректируем при необходимости.Этот код добавит вставки размером 10 пикселей сверху, слева и снизу текстового поля:
Примечание: UIEdgeInsetsMake принимает параметры в следующем порядке: сверху , слева , снизу , справа .
источник
textRectForBounds:
иeditingRectForBounds:
методы безclearButtonRectForBounds:
на iOS 7+ работали для меня.clearButtonRectForBounds:
просто помогает слегка подтолкнуть кнопку очистки влево. Вы можете оставить это. Мое текстовое поле было на темном фоне, а кнопка очистки нуждалась в небольшом дополнительном заполнении справа.Думал, что поставлю быстрое решение
Свифт 3+
источник
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
textRectForBounds
, заполнитель также будет затронут - так что добавление переопределенного заполнителя вставляет заполнитель еще на 10pt дальше. Если это то, что вы ищете, if, но если нет, то это полезно знать.Использование
textRectForBounds:
является правильным подходом. Я завернул это в моем подклассе, чтобы вы могли просто использоватьtextEdgeInsets
. Смотрите SSTextField .источник
стриж
источник
Для людей, которые ищут более простое решение.
Добавьте
UITextField
внутрь аUIView
. Чтобы имитировать вставку вокруг текстового поля, я оставляю 10 пикселей влево, а ширина на 20 пикселей меньше, чем у вида. Для закругленной угловой границы вокруг текстового поля используйте границу представленияисточник
UITextView
возможно?Вы можете установить текстовую вставку для UITextField, установив leftView.
Нравится:
источник
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
стриж
источник
Хороший подход для добавления отступов в UITextField - это создать подкласс UITextField и добавить свойство edgeInsets. Затем вы устанавливаете edgeInsets, и UITextField будет отображаться соответственно. Это также будет работать правильно с пользовательским набором leftView или rightView.
OSTextField.h
OSTextField.m
источник
Swift 3 / Разработан в Интерфейсном мастере / Раздельные горизонтальные и вертикальные насекомые / можно использовать из коробки
Применение:
&
источник
Я сделал это в IB, где я создал UIView позади textView, который был немного длиннее. С цветом фона textField установлен очистить.
источник
Это самый быстрый способ, который я нашел без каких-либо подклассов:
В Свифте:
источник
Вот тот же подкласс UITextField, написанный на Swift 3. Он довольно сильно отличается от предыдущих версий Swift, как вы увидите:
Кстати, вы также можете сделать что-то вроде следующего, если вы хотите контролировать вставку только одной стороны. Этот конкретный пример настройки только левой вставки полезен, если вы помещаете изображение поверх UITextField, но хотите, чтобы оно отображалось пользователю в текстовом поле:
источник
Версия Swift 4.2 :
источник
Вы можете настроить расположение текста в текстовом поле, сделав его подклассом
UITextField
и переопределив-textRectForBounds:
метод.источник
Абсурдно, что вы должны
UITextField
создавать подклассы, поскольку уже реализует методы, как указывает @Adam Waite. Вот быстрое расширение, которое предоставляет фабричный метод, также доступный в репо наших категорий :источник
Я поместил UITextField в подпункт, чтобы обработать это, которое поддерживает левую, верхнюю, правую и нижнюю вставку, а также очистить расположение кнопок.
MRDInsetTextField.h
MRDInsetTextField.m
Пример использования, где * _someTextField * происходит из представления nib / storyboard с пользовательским классом MRDInsetTextField
источник
Это не так коротко, как в других примерах, но использует совершенно другой подход к решению этой проблемы. Обратите внимание, каретка по-прежнему будет начинаться по левому краю, но текст будет правильно вставлен при вводе / отображении. Это работает без подклассов, если вы ищете только левое поле и уже используете
UITextFieldDelegate
для своих текстовых полей. Вам необходимо установить как текстовые атрибуты по умолчанию, так и атрибуты набора текста. Вы устанавливаете текстовые атрибуты по умолчанию при создании текстового поля. Атрибуты набора, которые необходимо установить в делегате. Если вы также используете местозаполнитель, вы захотите установить для него то же поле. В целом, вы получите что-то вроде этого.Сначала создайте категорию в
UITextField
классе.Затем, если вы используете размещенные держатели, убедитесь, что вы используете атрибут-заполнитель с тем же отступом. Создайте атрибутивный словарь по умолчанию с правильными атрибутами, примерно так:
Затем импортируйте указанную выше категорию и всякий раз, когда вы создаете текстовое поле, задайте отступ по умолчанию, делегируйте и используйте атрибуты заполнителя по умолчанию, определенные выше. Например:
Наконец, в делегате, реализуйте
textFieldDidBeginEditing
метод, что-то вроде этого:источник
defaultTextAttributes
содержитNSMutableParagraphStyle
это, довольно опасно. Я бы предпочел mutableCopy все это.Я обычно стараюсь избегать подклассов, но это работает, если у вас уже есть:
источник
Чтобы добавить другое решение, которое не требует подклассов:
Протестировано с iOS 7 и iOS 8. Оба работают. Тем не менее, существует вероятность того, что Apple изменит иерархию слоев UITextField, что испортит ситуацию.
источник
Вот полный ответ Swift, который включает в себя leftView (пользовательский значок) и пользовательскую кнопку очистки, которые устанавливаются в Interface Builder с настраиваемыми вставками.
источник
Решение, которое действительно работает и охватывает все случаи:
offsetBy
неinsetBy
.Rect
.Образец:
источник
Если вы хотите изменить отступ TOP и LEFT только тогда
// позиция заполнителя
// текстовая позиция
источник
Быстрое решение без подкласса и также проверяемое
источник