ios - programas - El tamaño de las viñetas en UITextField con secureTextEntry cambia el tamaño como interruptores de enfoque cuando se usa una fuente personalizada
fuentes html para web (5)
Tengo un UITextField
que utiliza la fuente Museo Sans Rounded 300. Todo funciona bien para los UITextFields normales, pero cuando configura secureTextEntry = YES
, entonces hay un cambio desconcertante en el tamaño de las viñetas a medida que el UITextField se enfoca (es decir, se convierte, y se renuncia, siendo el primer respondedor).
Cuando el UITextField
tiene el foco, las viñetas parecen estar utilizando la fuente personalizada, pero una vez que pierde el foco, cambian a ser estas viñetas mucho más grandes (tamaño estándar).
Acabo de probar el resultado anterior, la respuesta de @Javier Peigneux es la más concisa.
#pragma mark -- UITextFieldDelegate
- (void)textFieldDidBeginEditing:(UCSSafeTF *)safeTF{
safeTF.font = [UIFont fontWithName:@"Helvetica" size:14];
}
- (void)textFieldDidEndEditing:(UCSSafeTF *)safeTF{
safeTF.font = [UIFont fontWithName:@"Helvetica" size:14];
}
Ahora escribo así, y el resultado está bien. Entonces, la razón por la que ve que el tamaño de las viñetas cambia de pequeño a grande es muy clara, solo porque Apple iOS 10 a continuación nos "ayuda" a cambiar el tamaño de la fuente personalizada. La esperanza te ayudará.
Encontré una solución fácil y funciona bastante bien. Básicamente, tiene que cambiar la fuente a una fuente personalizada cuando configura secureTextEntry en yes.
- (void)textFieldDidBeginEditing:(UITextField *)textField{
if([textField.text isEqual:@"Password"]){
textField.text = @"";
textField.font = [UIFont fontWithName:@"Helvetica" size:14.5];
textField.secureTextEntry = YES;
}
}
- (void)textFieldDidEndEditing:(UITextField *)textField{
if([textField.text isEqual:@""]){
textField.text = @"Password";
textField.secureTextEntry = NO;
textField.font = [UIFont fontWithName:@"YourFont" size:14.5];
}
}
Entonces, la única forma que encontré para combatir esto fue usar los métodos de delegado textFieldDidBeginEditing
y textFieldDidEndEditing
, hacer un seguimiento de lo que se ingresó en el campo de texto, reemplazarlo con una máscara de viñetas y deshabilitar secureTextEntry
. Por lo tanto, cuando salen del campo, en realidad solo están viendo el número correcto de viñetas, en lugar de su texto seguro. Es intrépido y desordenado, pero servirá para mí, quizás también para ti.
Otra solución:
Si bien este es un error de iOS (y nuevo en iOS 7, debo agregar), tengo otra forma de solucionarlo que podría ser aceptable. La funcionalidad aún está ligeramente degradada pero no por mucho.
Básicamente, la idea es configurar la fuente a la familia / estilo de fuente predeterminada siempre que el campo tenga algo ingresado; pero cuando no se ingresa nada, configúralo a tu fuente personalizada. (El tamaño de la fuente se puede dejar solo, ya que es la familia / estilo, no el tamaño, que está lleno de errores). Atrape todos los cambios del valor del campo y establezca la fuente correspondiente en ese momento. Luego, el débil texto de "sugerencia" cuando no se ingresa nada tiene la fuente que desea (personalizada); pero cuando se ingresa algo (ya sea que esté editando o no) se usará el valor predeterminado (Helvetica). Dado que las balas son balas, esto debería verse bien.
El único inconveniente es que los caracteres, a medida que escribes antes de ser reemplazados por viñetas, usarán la fuente predeterminada (Helvetica). Eso es solo por una fracción de segundo por personaje. Si eso es aceptable, entonces esta solución funciona.
Simplemente cree un método al que se llame cada vez que se seleccione la opción para mostrar / ocultar la contraseña. Dentro del método, establezca la fuente en nil, luego establezca la fuente a su fuente y tamaño de fuente personalizados. También debe configurar la fuente y el tamaño personalizados en el método viewWillAppear. Dentro de este método, lo estás re-configurando.
De esta manera, no necesita deshabilitar secureTextEntry
(lo que podría hacer que su campo de texto sea vulnerable) y no necesita usar textFieldDidBeginEditing
o textFieldDidEndEditing
.
Ejemplo de código:
//if the password is obscured and the toggle to show it has been turned on, display password. Else, obscure it.
- (IBAction)togglePasswordVisibility:(id)sender {
// Xcode contains a bug where the font changes to default font if these two lines of code are not included.
self.passwordInputTextField.font = nil;
self.passwordInputTextField.font = [UIFont fontWithName:@"myCustomFontName" size:myDesiredFontSize]; //set this in viewWillAppear as well!
if (self.passwordInputTextField.secureTextEntry == YES) {
self.passwordInputTextField.secureTextEntry = NO;
[self.showHideButton setTitle:@"HIDE" forState:UIControlStateNormal];
} else {
self.passwordInputTextField.secureTextEntry = YES;
[self.showHideButton setTitle:@"SHOW" forState:UIControlStateNormal];
}
}