Изменение UIFont в безопасном UITextField странном поведении в iOS7
Я создаю простой проект: https://github.com/edzio27/textFieldExample.git
где я добавляю два UITextField
s, один с логином и второй с защищенным паролем. Я заметил там странное поведение:
- нажмите на логин и добавьте текст,
- нажмите на пароль и добавьте текст,
- нажмите еще раз, чтобы войти в систему
UITextField
![enter image description here]()
Обратите внимание, что существует странное поведение в размере шрифта паролей. Он отображается только в iOS7.
В чем может быть проблема?
Спасибо.
Ответы
Ответ 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];
Вот и все.