Estoy tratando de animar un UITextField
pero me ha atrapado un problema molesto y extraño. Mi animación tiene la siguiente secuencia:Comportamiento extraño al animar UITextField
En primer estado de la aplicación tiene la UITextField
, la cámara UIButton
y cancelar UIButton
después de que el botón de la cámara que no se ha mostró porque se ha colocado fuera de los límites de la aplicación. En realidad mi aplicación tiene 320 de anchura y el origen cancelar botón es (350,7)
En segundo estado, cuando toques de usuario en UITextField
, el botón canal alfa de la cámara se establece en 0 y el origen de botón de cancelación está establecido en (247,7).
El estado final es el mismo que el botón primer estado cuando el usuario toca el botón de retorno del teclado o de cancelar.
Durante el proceso, se animan el ancho de UITextField y el origen del botón cancelar en el eje x.
Mi código es:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
barcodeSearchButton.userInteractionEnabled = NO;
cancelButton.userInteractionEnabled = NO;
CGFloat cancelButtonXOffset = CGRectGetMaxX(barcodeSearchButton.frame) - cancelButton.frame.size.width;
CGFloat searchFieldWidth = searchField.frame.size.width - cancelButton.frame.size.width + barcodeSearchButton.frame.size.width;
[UIView animateWithDuration:0.3
animations:^{
searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldWidth, searchField.frame.size.height);
cancelButton.alpha = 1.0;
cancelButton.frame = CGRectMake(cancelButtonXOffset, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height);
barcodeSearchButton.alpha = 0.0;
}
completion:^(BOOL finished) {
barcodeSearchButton.userInteractionEnabled = NO;
cancelButton.userInteractionEnabled = YES;
}];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
barcodeSearchButton.userInteractionEnabled = NO;
cancelButton.userInteractionEnabled = NO;
[UIView animateWithDuration:0.3
animations:^{
searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldStartWidth, searchField.frame.size.height);
cancelButton.alpha = 0.0;
cancelButton.frame = CGRectMake(cancelButtonStartX, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height);
barcodeSearchButton.alpha = 1.0;
}
completion:^(BOOL finished) {
barcodeSearchButton.userInteractionEnabled = YES;
cancelButton.userInteractionEnabled = NO;
}];
}
Cuando la animación se ejecuta hasta que el estado final SOLAMENTE por primera vez, lo que significa, el usuario se refirió a UITextField, anotaba (esta parte es importante) un texto sobre el terreno y luego de que el usuario tocó el botón de retorno del teclado, aparece el problema. El problema es que el texto escrito en UITextField está animado cuando el ancho de UITextField está animado también.
La animación se comporta como abajo:
- Los
UITextField
tramos de nuevo a su valor inicial. - Cancelar espaldas de botón a su origen inicial
- botón de la cámara se ajusta a 1,0
- El texto escrito vuela desde la esquina superior izquierda de
UITextField
y aterriza enUITextfield
a la posición de la que no debería haber ido.
El problema es que el paso 4 no debería ocurrir y el problema es que ocurre una sola vez. Si comienza nuevamente el proceso (toque en uitextfield, escriba algo de texto, toque en la tecla de retorno) el paso 4 no ocurre.
Paso un día tratando de resolver este problema pero no tuve éxito.
Además, el uso de texto en lugar de la propiedad de texto de marcador de posición puede meterse con sus colores, por lo que tendrá que arreglar eso para arriba también. –