анимация ограничений анимируется не так, как ожидалось

#animation #uiviewcontroller #constraints

#Анимация #uiviewcontroller #ограничения

Вопрос:

следующий код используется для перемещения позиции текстового поля в место редактирования в приложении. к сожалению, это не дает желаемого эффекта.

textfield1 перемещается по X в свое конечное местоположение, а затем по y в свое конечное местоположение.

я хочу, чтобы оба ограничения создавали диагональное движение текстового поля, но это не работает при тестировании на iPhone.

анимация работает, но в итоге я получаю перевернутое движение в форме буквы «L» вместо диагонального движения «»

любые предложения, как это исправить, будут приняты с благодарностью.

     -(void)textFieldEditingPosition
{
    NSLog(@"editing");
[_regular setNeedsUpdateConstraints];
    switch (_activeTextField.tag)
    {
        case 1:
            self.textField2WidthConstraint.constant =_regular.frame.size.width/4 -16;
            self.textField2XConstraint.constant = -_regular.frame.size.width/4 - self.textField2WidthConstraint.constant/2 -8;
            self.textField2YConstraint.constant = -(_regular.frame.size.height/2 -_inputView.frame.size.height/2);

            _textField1YConstraint.constant = 0;
            _textField1XConstraint.constant = 0;
            _textField1WidthConstraint.constant = _placeHolderTextfield.frame.size.width;

            break;
        case 2:
            self.textField1XConstraint.constant = (_regular.frame.size.width /4) /2;
            self.textField1YConstraint.constant = -(_regular.frame.size.height/8 -8) ;
            self.textField1WidthConstraint.constant = _regular.frame.size.width/4 * 3 -16;

            self.textField2YConstraint.constant =0;
            self.textField2XConstraint.constant = 0;
            self.textField2WidthConstraint.constant = _placeHolderTextfield.frame.size.width;
            break;

        default:
            break;
    }
            [UIView animateWithDuration:0.7
                                  delay: 0.0
                                options: UIViewAnimationOptionCurveEaseInOut
                             animations:^{
                                [self.view layoutIfNeeded];
                             }
                             completion:nil];

}
 

Ответ №1:

Мне удалось решить эту проблему следующим образом

сначала я включил медленную анимацию в симуляторе.

это позволило мне точно увидеть, что происходит. Движение в форме буквы L, которое я видел, на самом деле было иллюзией, вызванной расширением ширины текстового поля по мере перемещения текстового поля в новую позицию x и y.

расширяющаяся ширина как бы отменяет движение в x, которое я ожидал увидеть.

разделяя расширение ширины на завершение анимации, я получаю нужный мне результат, который представляет собой диагональное перемещение текстового поля в положение редактирования.

расширение ширины текстового поля происходит в блоке завершения без анимации, что для меня нормально, поскольку фон текстового поля скрыт, и пользователь видит только текст-заполнитель.

при этом исправленный код:

 -(void)textFieldEditingPosition
{
    NSLog(@"editing");
    [_regular setNeedsUpdateConstraints];

    switch (_activeTextField.tag)
    {
        case 1:{
            self.textField2WidthConstraint.constant =_regular.frame.size.width/4 -16;
            self.textField2XConstraint.constant = -_regular.frame.size.width/4 - self.textField2WidthConstraint.constant/2 -8;
            self.textField2YConstraint.constant = -(_regular.frame.size.height/2 -_inputView.frame.size.height/2);

            _textField1YConstraint.constant = 0;
            _textField1XConstraint.constant = 0;
            [UIView animateWithDuration:0.7
                                  delay: 0.0
                                options: UIViewAnimationOptionBeginFromCurrentState
                             animations:^{
                                 [self.regular layoutIfNeeded];
                             }
                             completion:^(BOOL finished){
                                 self->_textField1WidthConstraint.constant = self->_placeHolderTextfield.frame.size.width;
                                 [self.regular layoutIfNeeded];}];
        }
            break;
        case 2:{
            self.textField1XConstraint.constant = (_regular.frame.size.width /4) /2;
            self.textField1YConstraint.constant = -(_regular.frame.size.height/8 -8) ;
            self.textField1WidthConstraint.constant = _regular.frame.size.width/4 * 3 -16;

            self.textField2YConstraint.constant =0;
            self.textField2XConstraint.constant = 0;

            [UIView animateWithDuration:0.7
                                  delay: 0.0
                                options: UIViewAnimationOptionBeginFromCurrentState
                             animations:^{
                                 [self.regular layoutIfNeeded];
                             }
                             completion:^(BOOL finished){
                                 self->_textField2WidthConstraint.constant = self->_placeHolderTextfield.frame.size.width;
                                                  [self.regular layoutIfNeeded];}];
        }
            break;

        default:
            break;
    }


}
 

Я уверен, что есть более чистый способ кодирования этого, но он работает, поэтому я испытываю облегчение

Спасибо