CATransform3DGetAffineTransform для переворачивания вида, не работающего при вызове один за другим

Я разрабатываю приложение для аквариума. Мне нужно генерировать движения рыб в нем. Рыба должна плавать и, дойдя до одного конца своего аквариума, должна сделать поворот(или флип) и переместиться на другой конец, снова повернуть(или флип) и вернуться в исходное положение.

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

Ниже приведены коды, которые я использую.....

CGFloat originalChildXpos = fishView.frame.origin.y;

/************************************** Animation 1 **************************************************************/

[UIView animateWithDuration:15.0
                      delay:1.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{                         
                     fishView.frame =CGRectMake(0, fishView.frame.origin.y, fishView.frame.size.width, fishView.frame.size.height);                         
                 }completion:NULL];


/*********************************** Animation 2 ****************************************************************/
[UIView animateWithDuration:2.4
                      delay:3.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     fishView.transform = CATransform3DGetAffineTransform(CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0));

                 }completion:NULL];



/********************************* Animation 3 ****************************************************************/
[UIView animateWithDuration:10
                      delay:3.4
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     fishView.frame = CGRectMake(-aquariumView.frame.size.width, fishView.frame.origin.y, fishView.frame.size.width, fishView.frame.size.height);
                 }completion:NULL];



/*************************************** Animation 4 *****************************************************/
[UIView animateWithDuration:1.4
                      delay:13.4
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     fishView.transform = CATransform3DGetAffineTransform(CATransform3DMakeRotation(-M_PI, 0.0, 1.0, 0.0));

                 }completion:NULL];


/************************************* Animation 5 *******************************************/
[UIView animateWithDuration:13.8
                      delay:2.2
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     fishView.frame = CGRectMake(originalChildXpos, fishView.frame.origin.y, fishView.frame.size.width, fishView.frame.size.height);
                 }completion:NULL];

я думаю, что я что-то пропустил при использовании функции CATransform3DGetAffineTransform(CATransform3DMakeRotation()), во второй раз флип-поворот.....

может ли кто-нибудь здесь показать мне выход из этого и объяснить, где я ошибаюсь

я также хотел бы знать, используя CATransform3D для вращения, координатные оси относительно вида, к которым применяется преобразование, изменяются или выполняются ??


person Rix_rapper    schedule 16.04.2013    source источник
comment
Является ли fishView представлением? Вы используете его как слой. Кроме того, кадрирование и преобразование плохо сочетаются друг с другом. Вы не должны использовать их так (в документации даже так написано)   -  person David Rönnqvist    schedule 16.04.2013
comment
да, fishview относится к классу View.   -  person Rix_rapper    schedule 16.04.2013
comment
но флип-анимация с использованием CATransform3DMakeRotation работает нормально в первый раз, но не во второй раз. почему так??   -  person Rix_rapper    schedule 16.04.2013
comment
Если я не ошибаюсь, это потому, что вращение -π и π — это одно и то же преобразование.   -  person David Rönnqvist    schedule 16.04.2013
comment
проверил, заменив -pi на pi....но тот же результат...   -  person Rix_rapper    schedule 16.04.2013
comment
Конечно, на шаге 1 у вас есть π, а на шаге 3 вы меняете его на -π.   -  person David Rönnqvist    schedule 16.04.2013
comment
можем ли мы применить одно и то же преобразование с помощью CATransform3D к одному и тому же пользовательскому интерфейсу один за другим??   -  person Rix_rapper    schedule 16.04.2013


Ответы (1)


  CGFloat originalChildXpos = fishView.frame.origin.y;
    CGAffineTransform currentTransform=fishView.transform; // step one add this

    /************************************** Animation 1 **************************************************************/

    [UIView animateWithDuration:15.0
                          delay:1.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{                         
                         fishView.frame =CGRectMake(0, fishView.frame.origin.y, fishView.frame.size.width, fishView.frame.size.height);                         
                     }completion:NULL];


    /*********************************** Animation 2 ****************************************************************/
    [UIView animateWithDuration:2.4
                          delay:3.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         fishView.transform = CATransform3DGetAffineTransform(CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0));

                     }completion:NULL];



    /********************************* Animation 3 ****************************************************************/
    [UIView animateWithDuration:10
                          delay:3.4
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         fishView.frame = CGRectMake(-aquariumView.frame.size.width, fishView.frame.origin.y, fishView.frame.size.width, fishView.frame.size.height);
                     }completion:NULL];



    /*************************************** Animation 4 *****************************************************/
    [UIView animateWithDuration:1.4
                          delay:13.4
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         fishView.transform = currentTransform;  // step 2 replace here 

                     }completion:NULL];


    /************************************* Animation 5 *******************************************/
    [UIView animateWithDuration:13.8
                          delay:2.2
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         fishView.frame = CGRectMake(originalChildXpos, fishView.frame.origin.y, fishView.frame.size.width, fishView.frame.size.height);
                     }completion:NULL];

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

person Arun    schedule 17.04.2013
comment
все тот же результат .... рыба все еще реагирует на 1 функцию вращения / переворота, а не на другую ... могу ли я получить хорошую ссылку на учебник для таких преобразований ... - person Rix_rapper; 17.04.2013
comment
я получил u ... во время преобразования для поворота координатные оси тоже получают преобразование ... но мне нужно больше узнать об этом ... не могли бы вы предоставить мне хорошую ссылку на учебник, которая может помочь мне в дальнейшем .... - person Rix_rapper; 18.04.2013