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

Изменение UIFont в безопасном UITextField странном поведении в iOS7

Я создаю простой проект: https://github.com/edzio27/textFieldExample.git

где я добавляю два UITextField s, один с логином и второй с защищенным паролем. Я заметил там странное поведение:

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

enter image description here

Обратите внимание, что существует странное поведение в размере шрифта паролей. Он отображается только в iOS7.

В чем может быть проблема?

Спасибо.

4b9b3361

Ответ 1

Как отмечали пара людей, кажется, что защищенные текстовые поля не всегда хорошо сочетаются с пользовательскими шрифтами. Я работал над этим, используя UITextField UIControlEventEditingChanged для отслеживания изменений в текстовом поле и установки его на системный шрифт (с обычными выглядящими маркерами), когда что-либо вводится, иначе используйте мой собственный шрифт.

Это позволяет мне использовать мой собственный шрифт для заполнителя текстового поля и по-прежнему хорошо выглядеть при вводе пароля. Символы, которые будут отображаться по одному во время ввода, будут системным шрифтом, но я в порядке с этим.

В viewDidLoad:

[self.passwordTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

Теперь добавьте метод textFieldDidChange:

- (void)textFieldDidChange:(id)sender
{
    UITextField *textField = (UITextField *)sender;

    if (textField == self.passwordTextField) {
        // Set to custom font if the textfield is cleared, else set it to system font
        // This is a workaround because secure text fields don't play well with custom fonts
        if (textField.text.length == 0) {
            textField.font = [UIFont fontWithName:@"OpenSans" size:textField.font.pointSize];
        }
        else {
            textField.font = [UIFont systemFontOfSize:textField.font.pointSize];
        }
    }
}

Ответ 2

Переключение безопасного/небезопасного состояния с помощью настраиваемого шрифта: для отображения "защищенного" текста (символы блоба) шрифт, содержащий символ blob, устанавливается iOS. Это шрифт, который вы позже видите в тексте рендеринга при переключении в небезопасный режим.

Хотя текстовое поле сохраняет назначенный пользовательский шрифт, содержимое поля является атрибутной строкой, которая ссылается на шрифт, содержащий blob.

Простое решение: напишите в поле атрибутированной строки, и ваш правильный, настраиваемый шрифт будет повторно применен.

Чтобы отключить безопасную запись и сохранить собственный шрифт:

passwordTextField.secureTextEntry = false

// We have to remove iOS' secure font by setting attributedText.
let pwd = passwordTextField.text!
passwordTextField.attributedText = NSAttributedString(string: pwd)

Ответ 3

Если вы отключите параметр "Настроить на Fit" в поле пароля, он перестанет делать это изменение размера, когда вы уйдете в отставку ответчика.

Ответ 4

Установите делегат вашего текстового поля и добавьте его:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (!textField.secureTextEntry) {
        return YES;
    }

    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if (textField.text.length > 0) {
        textField.font = [UIFont systemFontOfSize:18.0f];
    } else {
        textField.font = [UIFont fontWithName:@"YourFont" size:18.0f];
    }

    return NO;
}

Ответ 5

Проверьте это: UITextField secureTextEntry пули с пользовательским шрифтом?

Существует элегантное решение glyuck, которое мне понравилось. http://github.com/elegion/ELFixSecureTextFieldFont Он создал категорию на UITextField. Чтобы иметь красиво отображаемые точки, вы должны включить ELFixSecureTextFieldFont.h и .m, а затем вызывать - (void) fixSecureTextFieldFont на вашем текстовом поле один раз:

[yourCustomSecureTextField fixSecureTextFieldFont];

Вот и все.