UIView的动画移动和旋转效果不太理想。

5
我想创建一个动画,同时移动和旋转UIView。我尝试了以下代码:
[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration];

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

[UIView commitAnimations];

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

如何正确地同时动画移动和旋转视图?


它定义在“beginAnimations”行之前:CGRect newFrame = CGRectMake(30,30,200,200); - kiteloop
4个回答

9
如果您同时需要对旋转等进行动画处理,则无法使用frame、bounds或center。您需要针对所有内容使用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
尝试按照以下方式操作:(以向左移动和旋转为例)
[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
你需要做这个:
#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
问题可能出在您的新框架大小与原始框架大小的比较上。当您旋转一个框架时,视图框架会变得有些棘手:
框架位于父视图的坐标系中。因此,当您旋转一个矩形时,新框架将是包含视图的最小矩形,其坐标系为父视图的坐标系。
例如,如果您有一个框架大小为(100*100)的正方形视图,并将其旋转45度,则新框架的大小将为(141*141)。如果您将框架设置为大小为(100*100),则会剪切部分视图。
请参考这里以更好地理解视图框架的工作原理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接