Зачем мне это делать и есть ли лучший способ?Анимационные блоки в приложении для iPhone OS4 - PullRequest
4 голосов
/ 14 июля 2010

Итак, у меня есть несколько блоков анимации для создания очень простых анимаций в моем приложении (например, непрерывно вращающееся колесо). Это код для анимации (я изменился, если из старого блока стиля commitanimations, но получил ту же проблему с этим).

[UIView animateWithDuration:30 delay:0.0
     options:(UIViewAnimationOptionAllowUserInteraction |
     UIViewAnimationOptionCurveLinear 
  |  UIViewAnimationOptionRepeat)
animations:^(void){
     wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5);
 }
completion:^(BOOL finished){
 if(finished){NSLog(@"^^^^^^^^wheel^^^^FINSIHED");
   ]}
}];

Проблема, с которой я столкнулся, заключается в том, что на OS4, когда приложение было отключено до панели многозадачности и возобновлено, анимация останавливается. Если при возобновлении я сбрасываю позицию, когда приложение снова становится активным, как это ....

wheel.transform = CGAffineTransformMakeRotation(0);

тогда это продолжается.

Это не идеально, потому что моя анимация пропускается при перезапуске. Я не понимаю, почему это происходит или почему я должен сделать это.

Метод "по окончании" вызывается практически сразу после запуска анимации, что странно, поскольку эта анимация никогда не должна завершаться. Также он НЕ вызывается, когда приложение становится активным и анимация фактически останавливается.

У кого-нибудь есть идеи или предложения? Я уже давно борюсь с этим ...

Ответы [ 3 ]

1 голос
/ 07 декабря 2011

У меня похожая проблема.Я смог преодолеть эту проблему, отключив возможность запуска приложения в фоновом режиме, добавив ключ: «Приложение не запускается в фоновом режиме» и установив для него значение YES в файле info.plist.Если вашему приложению не нужно работать в фоновом режиме и все в порядке, если оно восстанавливается до исходного состояния при возобновлении, тогда это будет работать.

1 голос
/ 21 июля 2010

Вы должны либо установить таймер с помощью NSTimer, либо использовать CADisplaylink следующим образом: displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector (animateImages :)];и измените вращение CGAffineTransformMakeRotation (градусы) вашего представления в методе делегата.

0 голосов
/ 08 сентября 2010

Синтаксис вашего кода недействителен; Ваш код не будет компилироваться, как показано на рисунке. Правильная версия будет:

    [UIView animateWithDuration:2 delay:0.0
                    options:(UIViewAnimationOptionAllowUserInteraction |
                             UIViewAnimationOptionCurveLinear 
                             |  UIViewAnimationOptionRepeat)
                 animations:^(void){
                     wheel.transform = CGAffineTransformMakeRotation(M_PI*-0.5);
                 }
                 completion:^(BOOL finished){
                     if(finished) NSLog(@"^^^^^^^^wheel^^^^FINSIHED");
                 }
     ];

Причина, по которой блок «на готово» вызывается, когда приложение возобновляет работу после приостановки и вы снова запускаете анимацию, заключается в том, что преобразование колеса уже находится в своей конечной позиции (это то место, где вы установили его в своем блоке анимации) , Итак, когда приложение возобновляет работу, вы должны сначала сбросить преобразование колеса (я бы сделал это, установив его в CGAffineTransformIdentity), а затем запустить анимацию.

Более разумным подходом было бы использование CGAffineTransformRotate (а не CGAffineTransformMakeRotation). Таким образом, вы можете установить преобразование, основываясь на том, чем оно является сейчас, а не устанавливать его абсолютно.

    [UIView animateWithDuration:2 delay:0.0
                    options:(UIViewAnimationOptionAllowUserInteraction |
                             UIViewAnimationOptionCurveLinear 
                             |  UIViewAnimationOptionRepeat)
                 animations:^(void){
                     wheel.transform = CGAffineTransformRotate(view.transform, (M_PI*-0.5));
                 }
                 completion:^(BOOL finished){
                     // whatever
                 }
    ];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...