Я пытаюсь оживить UITextField
, но меня поймала раздражающая и странная проблема.Моя анимация имеет следующую последовательность:
В первом состоянии приложение имеет UITextField
, камеру UIButton
и отмену UIButton
после кнопки камеры, котораяне было показано, потому что он был расположен за пределами приложения.На самом деле мое приложение имеет ширину 320 и начало координат кнопки отмены (350,7)
Во втором состоянии, когда пользователь касается UITextField
, альфа-канал кнопки камерыустановлен на 0, а начало кнопки отмены установлено на (247,7).
Конечное состояние совпадает с первым состоянием после того, как пользователь коснулся кнопки возврата наклавиатура или кнопка отмены.
Во время процесса анимируются ширина UITextField и начало кнопки отмены по оси x.
Мой код:
- (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;
}];
}
Когда анимациявыполняется до ТОЛЬКО конечного состояния в первый раз, что означает, что пользователь коснулся UITextField, WROTE DOWN (эта часть важна) некоторого текста в поле, и после этого пользователь коснулся кнопки возврата на клавиатуре, возникает проблема.Проблема в том, что напечатанный текст в UITextField анимируется, когда анимируется также и ширина UITextField.
Анимация ведет себя следующим образом:
-
UITextField
растягивается до исходногозначение. - Кнопка отмены возвращается к исходному источнику
- Для кнопки камеры установлено значение 1,0
- Набранный текст вылетает из верхнего левого угла
UITextField
и приземляетсяв UITextfield
в положение, в которое он не должен был уйти.
Проблема в том, что шаг 4 не должен выполняться, а проблема в том, что это происходит только один раз.Если запустить процесс заново (коснитесь поля uitext, введите текст, коснитесь клавиши возврата), шаг 4. не произойдет.
Я потратил целый день, пытаясь решить эту проблему, но мне не удалось.