Странное поведение при анимации UITextField

Я пытаюсь анимировать UITextField , но меня поймала раздражающая и странная проблема . Моя анимация имеет следующую последовательность:

first state

В первом состоянии приложение имеет UITextField , камеру UIButton и UIButton отмены после кнопки камеры, которая находится не был показан, потому что он был размещен за пределами приложения. На самом деле мое приложение имеет ширину 320, а начало отсчета кнопки отмены - (350,7)

second state

Во втором состоянии, когда пользователь касается UITextField , альфа-канал кнопки камеры устанавливается на 0, а начало отсчета кнопка отмены установлена ​​в положение (247,7).

final state

Конечное состояние такое же, как первое состояние после того, как пользователь коснулся кнопки возврата на клавиатуре или кнопки отмены.

Во время процесса анимируются ширина 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, НАПИСАЛ (эта часть важна) некоторый текст в поле, а затем пользователь при нажатии на кнопку возврата клавиатуры появляется проблема. Проблема в том, что набранный текст в UITextField анимируется, когда ширина UITextField тоже анимируется.

Анимация ведет себя, как показано ниже:

  1. UITextField возвращается к своему начальному значению.
  2. Кнопка отмены возвращается в исходное положение
  3. Кнопка камеры установлена ​​на 1.0
  4. Напечатанный текст вылетает из верхнего левого угла UITextField и попадает в UITextfield ] в положение, в которое он не должен был попасть.

Проблема в том, что шаг 4 не должен происходить, а проблема в том, что это происходит только один раз. Если запустить процесс снова (коснитесь поля uitext, введите текст, коснитесь клавиши возврата), шаг 4 не произойдет.

Я целый день пытался решить эту проблему, но безуспешно.

5
задан Meet Doshi 27 January 2016 в 11:50
поделиться