it-swarm.com.ru

Как установить межбуквенный интервал UITextField

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

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

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

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

 TextField with correct spacing

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

 TextField with wrong spacing

31
KMV

Это то, что в конечном итоге сработало, чтобы установить керн для каждого изменения

    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 для каждой цифры.

8
KMV

Не нужно переходить к attributeText, который, честно говоря, был беспорядок, реализованный с измененным интервалом. Как только я закрыл клавиатуру, интервал исчез, что побудило меня копать дальше. 

Каждый UITextField имеет свойство defaultTextAttributes, которое согласно Apple «возвращает словарь текстовых атрибутов со значениями по умолчанию».. Apple document также говорит, что "это свойство применяет указанные атрибуты ко всему тексту текстового поля" 

Просто найдите подходящее место в вашем коде, обычно там, где инициализируется текстовое поле, а затем скопируйте и вставьте следующее.

Ответил в Swift 3.0 

textfield.defaultTextAttributes.updateValue(spacing, forKey: NSKernAttributeName)

где интервал имеет тип CGFloat. Например 2.0

Это работает для разных шрифтов. 

Ура !!


Последний синтаксис выглядит так:

 yourField.defaultTextAttributes.updateValue(36.0, 
     forKey: NSAttributedString.Key.kern)
24
iOSer

Используйте свойство defaultTextAttributesUITextField. Он будет обрабатывать преобразование в NSAttributedString для вас и применять установленные вами атрибуты. Например:

    NSMutableDictionary *attrs = [self.textField.defaultTextAttributes mutableCopy];
[attrs addEntriesFromDictionary:@{
    NSKernAttributeName: @18,
    NSUnderlineColorAttributeName: [UIColor grayColor],
    NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDash)
}];
self.textField.defaultTextAttributes = attrs;
3
Avi

Попробуйте этот код После установки делегата в текстовое поле. Надеюсь, он будет работать.

- (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;
}
0
Vishnuvardhan

Не совсем уверен ни в каком другом решении вместо использования приписанной строки.

Но для части уведомления вы можете установить делегат textFields равным UIView и определить метод ниже в представлении. 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 

Вышеуказанный метод вызывается каждый раз, когда текст, введенный в текстовое поле, изменяется.

0
Scarlet

Это работает нормально в 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)
    }
}
0
Arvind Kumar