Если все, что вы хотите сделать, это вращать изображение бесконечно, это работает довольно хорошо и очень просто:
NSTimeInterval duration = 10.0f;
CGFloat angle = M_PI / 2.0f;
CGAffineTransform rotateTransform = CGAffineTransformRotate(imageView.transform, angle);
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionRepeat| UIViewAnimationOptionCurveLinear animations:^{
imageView.transform = rotateTransform;
} completion:nil];
По моему опыту, это работает безупречно, но убедитесь, что ваше изображение способно вращаться вокруг его центра без каких-либо смещений, иначе анимация изображения будет "прыгать", как только она перейдет к PI.
Чтобы изменить направление вращения, измените знак angle
(angle *= -1
).
Обновление Комментарии @AlexPretzlav заставили меня вернуться к этому, и я понял, что когда я писал это, изображение, которое я вращал, отражалось вдоль вертикальной и горизонтальной оси, то есть изображение действительно вращалось только на 90 °. градусов, а затем сбрасывается, хотя выглядело как будто оно продолжало вращаться вокруг.
Итак, если ваше изображение похоже на мое, это будет работать отлично, однако, если изображение не симметрично, вы заметите «защелку» к исходной ориентации после 90 градусов.
Чтобы повернуть несимметричное изображение, лучше принять принятый ответ.
Одно из этих менее изящных решений, показанных ниже, действительно повернет изображение, но при перезапуске анимации может возникнуть заметное заикание:
- (void)spin
{
NSTimeInterval duration = 0.5f;
CGFloat angle = M_PI_2;
CGAffineTransform rotateTransform = CGAffineTransformRotate(self.imageView.transform, angle);
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.imageView.transform = rotateTransform;
} completion:^(BOOL finished) {
[self spin];
}];
}
Вы также можете сделать это только с блоками, как предлагает @ richard-j-ross-iii, но вы получите предупреждение о сохранении цикла, поскольку блок захватывает сам себя:
__block void(^spin)() = ^{
NSTimeInterval duration = 0.5f;
CGFloat angle = M_PI_2;
CGAffineTransform rotateTransform = CGAffineTransformRotate(self.imageView.transform, angle);
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.imageView.transform = rotateTransform;
} completion:^(BOOL finished) {
spin();
}];
};
spin();