Как установить расстояние между буквами UITextField
У меня есть приложение, в котором пользователь должен ввести четырехзначный пин-код. Все цифры должны находиться на заданном расстоянии друг от друга.
Есть ли способ сделать это, если PinTextField
является подклассом UIView
? Я знаю, что в ViewController
вы можете использовать UITextFieldTextDidChangeNotification
и установить атрибут текста для каждого изменения. Однако уведомления не работают в UIView
.
Также мне было интересно, нет ли более простого способа, чем создание атрибутной строки для каждого обновления, если вы хотите установить расстояние между буквами текста UITextField
?
Правильный интервал:
![TextField с правильным интервалом]()
Неправильный интервал:
![TextField с неправильным интервалом]()
Ответы
Ответ 1
Это то, что в конечном итоге сработало, чтобы установить ядро для каждого изменения
textField.addTarget(self, action: "textFieldDidChange", forControlEvents: .EditingChanged)
func textFieldDidChange () {
let attributedString = NSMutableAttributedString(string: textField.text)
attributedString.addAttribute(NSKernAttributeName, value: 5, range: NSMakeRange(0, count(textField.text)))
attributedString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, count(textField.text)))
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(), range: NSMakeRange(0, count(textField.text)))
textField.attributedText = attributedString
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if count(textField.text) < 4 {
return true
// Else if 4 and delete is allowed
}else if count(string) == 0 {
return true
// Else limit reached
}else{
return false
}
}
Однако проблема остается в том, что разные числа имеют разную ширину, я просто вернусь к созданию UITextField
для каждой цифры.
Ответ 2
Не нужно идти на атрибутText, который, честно говоря, был бесполезным с измененным интервалом. Как только я закрыл клавиатуру, пробел исчез, что побудило меня копать дальше.
Каждый UITextField имеет свойство, называемое defaultTextAttributes, которое, согласно Apple, "возвращает словарь текстовых атрибутов со значениями по умолчанию". В документе Apple также говорится, что "это свойство применяет указанные атрибуты ко всему тексту текстового поля"
Просто найдите подходящее место в своем коде, обычно там, где текстовое поле инициализируется, а затем скопируйте и вставьте следующее.
Ответил в Swift 3.0
textfield.defaultTextAttributes.updateValue(spacing, forKey: NSKernAttributeName)
где интервал имеет тип CGFloat. Например, 2.0
Это работает и для разных шрифтов.
Ура !!
Последний синтаксис выглядит следующим образом:
yourField.defaultTextAttributes
.updateValue(20.0, forKey: NSAttributedStringKey.kern.rawValue)
Ответ 3
Используйте свойство defaultTextAttributes
UITextField
. Он будет обрабатывать преобразование в NSAttributedString
для вас и применять установленные вами атрибуты. Например:
NSMutableDictionary *attrs = [self.textField.defaultTextAttributes mutableCopy];
[attrs addEntriesFromDictionary:@{
NSKernAttributeName: @18,
NSUnderlineColorAttributeName: [UIColor grayColor],
NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDash)
}];
self.textField.defaultTextAttributes = attrs;
Ответ 4
Не уверен в отношении какого-либо другого решения вместо использования атрибутной строки.
Но для части уведомления вы можете установить делегат textFields
в UIView
и определить ниже метод в представлении.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
Вышеуказанный метод вызывается каждый раз, когда текст, введенный в текстовое поле, изменяется.
Ответ 5
Попробуйте этот код. После установки делегата в текстовое поле. Надеюсь, он сработает.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:textField.text];
[attributedString addAttribute:NSKernAttributeName
value:@(5.4)
range:NSMakeRange(0, textField.text.length)];
textField.attributedText = attributedString;
return YES;
}
Ответ 6
Это работает отлично в Swift 2.2. Надеемся, что это поможет вам для разметки букв в текстовом поле.
override func viewDidLoad() {
// Do any additional setup after loading the view.
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SignupVC.limitTextField(_:)), name: "UITextFieldTextDidChangeNotification", object: txtContactNumber)
}
func limitTextField(Notif:NSNotification) {
let limit=10;
let attributedString = NSMutableAttributedString(string: txtContactNumber.text!)
attributedString.addAttribute(NSKernAttributeName, value: 7, range: NSMakeRange(0, (txtContactNumber.text?.characters.count)!))
// attributedString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, count(textField.text)))
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(), range: NSMakeRange(0,(txtContactNumber.text?.characters.count)!))
txtContactNumber.attributedText = attributedString
if(txtContactNumber.text?.characters.count>limit)
{
txtContactNumber.text=txtContactNumber.text?.substringToIndex(limit)
}
}