Подтвердить что ты не робот

Как установить расстояние между буквами UITextField

У меня есть приложение, в котором пользователь должен ввести четырехзначный пин-код. Все цифры должны находиться на заданном расстоянии друг от друга.

Есть ли способ сделать это, если PinTextField является подклассом UIView? Я знаю, что в ViewController вы можете использовать UITextFieldTextDidChangeNotification и установить атрибут текста для каждого изменения. Однако уведомления не работают в UIView.

Также мне было интересно, нет ли более простого способа, чем создание атрибутной строки для каждого обновления, если вы хотите установить расстояние между буквами текста UITextField?

Правильный интервал:

TextField с правильным интервалом

Неправильный интервал:

TextField с неправильным интервалом

4b9b3361

Ответ 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)
    }
}