Отключить перемещение курсора UITextField после максимального ввода - PullRequest
0 голосов
/ 14 октября 2019

Я создал пользовательский компонент UITextField для ввода фиксированного размера. Ширина TextField, размер шрифта, кернинг и количество символов фиксированы. Я могу запретить пользователю вводить более 8 символов (см. Ниже метод shouldChangeCharactersIn), однако после 8-го символа курсор автоматически перемещается в следующую позицию, что создает следующую проблему.

problematic gif

Я хочу показать все введенные символы без уменьшения их размера. Поэтому

[1 2 3 4 5 6 7 8] должно отображаться вместо [2 3 4 5 6 7 8 |]

Я пытался поместить курсор вправо от восьмого символа, однако это меняет весь кернинг и влияет на все остальные символы.

Как правильно обращаться с этим? Как я должен предотвратить движение курсора, чтобы UITextField не прокручивал вправо?

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let textFieldText = textField.text,
        let rangeOfTextToReplace = Range(range, in: textFieldText),
        !string.containsSpecialCharacters else {
            return false
    }
    let substringToReplace = textFieldText[rangeOfTextToReplace]
    let count = textFieldText.count - substringToReplace.count + string.count

    return count <= 8
}

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

попробуйте следующий код:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if textField.text?.count ?? 0 <= 7{
            if textField.text?.count ?? 0 == 7{
                DispatchQueue.main.async {
                    textField.resignFirstResponder()
                }
            }
            return true
        }
        textField.resignFirstResponder()
        return false
    }

установите для делегата customTextField значение self в методе viewDidLoad вашего viewController и подтвердите UITextFieldDelegate protocol

0 голосов
/ 17 октября 2019

Я решил проблему, поменяв керн после последнего символа. Так что теперь, вместо того, чтобы прыгать 40pt, курсор переходит только на 1pt (или любой другой метод, установленный ниже)

@objc private func textFieldDidChange() {

    guard let text = textField.text else { return }

    if text.count == Constant.deviceCodeCharacterCount {
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(.kern, value: Constant.deviceCodeCharacterSpacing, range: NSRange(location: 0, length: text.count - 1))
        attributedString.addAttribute(.kern, value: 1, range: NSRange(location: Constant.deviceCodeCharacterCount - 1, length: 1))
        textField.attributedText = attributedString
    }
}

enter image description here

0 голосов
/ 14 октября 2019

Что произойдет, если вы попробуете этот код?

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
    if range.location < 8 {
        return true
    }
    // return NO to not change text
    return false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...