5

我想创建一个同时移动和旋转 UIView 的动画。我尝试了以下代码:

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

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

[UIView commitAnimations];

结果是,动画完成后视图绘制不正确(某些部分不再可见)。如果我只更改动画的框架或转换,则视图将正确绘制。仅当我同时设置框架和转换时才会出现问题。

同时动画移动和旋转视图的正确方法是什么?

4

4 回答 4

9

如果您还要为旋转等设置动画,则不能使用框架、边界或中心。您需要对所有内容使用 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];
于 2010-12-09T04:44:06.520 回答
4

尝试这样做:(例如,向左移动和旋转)

[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];  

当然,中心点位置将是您希望使视图移动的点。

于 2010-12-07T19:47:04.017 回答
0

与原始帧大小相比,问题可能在于您的新帧大小。旋转框架时,视图框架有点棘手:框架位于超级视图坐标系中。因此,当您旋转一个矩形时,新框架将是包含该视图的父视图坐标系中的最小矩形。例如,如果您有一个框架大小为 (100*100) 的方形视图并将其旋转 45 度,那么您的新框架的大小将是 (141*141),并且如果您将框架设置为 (100*100) ) 你会削减你的看法的一部分。查看此处以更好地了解视图框架的工作原理。

于 2010-12-08T02:38:52.667 回答
0

你需要这样做:

#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;
}

我有同样的问题,但做了一些实验并想出了这个解决方案。

于 2010-12-08T06:42:22.613 回答