动画移动和旋转UIView并不是很有效

时间:2010-12-07 19:27:26

标签: iphone ipad ios uiview cgaffinetransform

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

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

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

[UIView commitAnimations];

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

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

4 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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];  

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

答案 2 :(得分:0)

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

答案 3 :(得分: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;
}

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