Поверните UIView iPhone - PullRequest
       12

Поверните UIView iPhone

12 голосов
/ 28 марта 2011

Я работаю над игрой-головоломкой, и мне нужно поворачивать кусочки головоломки на угол 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 в прежнее состояние.

Как мне повернутькусок головоломки с анимацией без этих проблем?

Ответы [ 4 ]

48 голосов
/ 28 марта 2011

Попробуйте

[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)
5 голосов
/ 28 марта 2011

Ваш первый метод хорош, кроме угла в радианах

[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(90/180*M_PI);
[UIView commitAnimations];
4 голосов
/ 25 июня 2014

Большинство сейчас используют анимационные блоки для анимации 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];
        }
    }];
}
2 голосов
/ 20 августа 2013

Мне лучше всего объявить функцию 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...