Поверните UIView iPhone
Я работаю над играми-головоломкой, и мне нужно вращать кусочки головоломки до угла 90
градусов при каждом двойном касании.
Я пытался сделать это, используя два разных способа. Первый метод:
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(90);
[UIView commitAnimations];
Единственные проблемы с этим: кусок НЕ вращается 90
градусов; он вращается вокруг 100
градусов и что эта анимация изменяет рамку куска головоломки UIView
.
Это мой вывод на консоль:
frame BEFORE ROTATION: {{35, 178}, {80, 80}}
frame AFTER ROTATION: {{21.3172, 164.317}, {107.366, 107.366}}
Второй метод, который я пробовал, был следующим:
CABasicAnimation* spinAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:1];
[self.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
Проблема с этим методом заключается в том, что после завершения вращения он меняет мой UIView
на его предыдущее состояние.
Как я могу вращать кусочек головоломки с анимацией без этих проблем?
Ответы
Ответ 1
Попробуйте
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(DegreesToRadians(90));
[UIView commitAnimations];
где вы можете определить DegreesToRadians как
#define DegreesToRadians(x) ((x) * M_PI / 180.0)
Ответ 2
Ваш первый метод хорош, кроме угла в радиусе
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(90/180*M_PI);
[UIView commitAnimations];
Ответ 3
Большинство пользователей теперь используют анимационные блоки для анимации iOS. Так что кое-что вроде этого - это то, что я бы рекомендовал (конечно, вы можете настроить свои собственные параметры времени и анимации и градусы для вращения). Наслаждайтесь
[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^{
YOURVIEW.transform = CGAffineTransformMakeRotation(DegreesToRadians(180));
} completion:^(BOOL finished) {
}];
#define DegreesToRadians(x) ((x) * M_PI / 180.0)
если вы ищете поворот на 360 градусов, который немного сложнее, поскольку он не хочет анимировать поворот того, что в конечном итоге будет именно там, где он начал, поэтому используйте что-то вроде этого:
- (void)rotateSpinningView:(UIView *)viewToSpin{
[UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
[viewToSpin setTransform:CGAffineTransformRotate(viewToSpin.transform, M_PI_2)];
} completion:^(BOOL finished) {
if (finished && !CGAffineTransformEqualToTransform(viewToSpin.transform, CGAffineTransformIdentity)) {
[self rotateSpinningView:viewToSpin];
}
}];
}
Ответ 4
Мне это лучше всего объявить функцию C
static inline CGFloat degreesToRadians(CGFloat degrees) {return (degrees) * M_PI / 180.0f;}
и использовать его так:
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(degreesToRadians(180.0f));
[UIView commitAnimations];