Синтаксис вашего кода недействителен; Ваш код не будет компилироваться, как показано на рисунке. Правильная версия будет:
[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
}
];
Я предполагаю, что ваше колесо симметрично относительно выбранного вами угла, поэтому пользователь никогда не увидит разницу, и проскальзывание, на которое вы жалуетесь (при сбросе преобразования), будет устранено.