Анимированное перемещение и вращение UIView не совсем работает - PullRequest
5 голосов
/ 07 декабря 2010

Я хочу создать анимацию, которая перемещает и вращает UIView одновременно.Я попробовал следующий код:

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration];

myView.frame = newFrame;
myView.transform = CGAffineTransformMakeRotation(0.4);

[UIView commitAnimations];

В результате после анимации изображение отображается неправильно (некоторые части больше не видны).Если я изменю только кадр ИЛИ трансформацию для анимации, вид отрисовывается правильно.Проблема возникает только в том случае, если я установил как рамку, так и трансформацию.

Как правильно будет анимировать перемещение и поворот вида одновременно?

Ответы [ 4 ]

9 голосов
/ 09 декабря 2010

Нельзя использовать рамку, границы или центр, если вы также анимируете такие вещи, как вращение. Вам нужно использовать CGAffineTransforms для всего и объединить их вместе. Вот так:

CGAffineTransform transform = CGAffineTransformMakeTranslation(100,100);
transform = CGAffineTransformRotate(transform, 0.4);

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration];

myView.transform = transform;

[UIView commitAnimations];
4 голосов
/ 07 декабря 2010

Попробуйте сделать это следующим образом: (например, двигаясь влево и вращаясь)

[UIView beginAnimations:@"MoveAndRotateAnimation" context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration];

CGPoint center         = CGPointMake(-200, self.view.center.y);
self.view.transform    = CGAffineTransformMakeRotation(-0.5);
self.view.center       = center;

[UIView commitAnimations];  

Местоположения центральной точки - это, конечно, точка, которую вы хотите сделать движением вида.

0 голосов
/ 08 декабря 2010

Вам нужно сделать это:

#pragma mark (Woblling animation)   
    CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-10.0));
    CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(10.0));

    self.view .transform = leftWobble;  // starting point
    [UIView beginAnimations:@"wobble" context:self.view ];
    [UIView setAnimationRepeatAutoreverses:YES]; // important
    [UIView setAnimationRepeatCount:11];
    [UIView setAnimationDuration:1.00];
    //[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];//should be same as written
    self.view .transform = rightWobble; // end here & auto-reverse
    [UIView commitAnimations];

и затем реализовать эти методы.Они необходимы, чтобы держать ваш вид в том же положении после поворота.

- (void) wobbleEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{
    if ([finished boolValue]) {
        UIView* item = (UIView *)context;
        item.transform = CGAffineTransformIdentity;
    }
}

Используйте этот метод, если вы используете навигацию и когда вы переходите от одного вида к другому, ваш вид будет в том же месте. оставьте этот метод:

- (void)viewWillAppear:(BOOL)animated
{
    UIView* item = self.view;
    item.transform = CGAffineTransformIdentity;
}

У меня была такая же проблема, но я провел несколько экспериментов и нашел это решение.

0 голосов
/ 08 декабря 2010

Возможно, проблема в новом размере кадра по сравнению с исходным размером кадра.Просмотр кадра немного сложен при повороте кадра: кадр находится в системе координат суперпредставлений.Таким образом, когда вы поворачиваете прямоугольник, новый кадр будет самым маленьким прямоугольником в системе координат суперпредставления, которая содержит представление.Например, если у вас квадратный вид с размером кадра (100 * 100) и поверните его на 45 градусов, ваш новый кадр будет иметь размер (141 * 141), и если вы установите размер кадра (100 * 100)Вы отрежете часть своего взгляда.Посмотрите на здесь для лучшего понимания того, как работает рамка просмотра.

...