我想创建一个动画,同时移动和旋转UIView。我尝试了以下代码:
[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:kAnimationDuration];
myView.frame = newFrame;
myView.transform = CGAffineTransformMakeRotation(0.4);
[UIView commitAnimations];
结果是,在动画完成后,视图绘制不正确(某些部分不再可见)。如果我只更改动画的帧或变换,则视图会正确绘制。如果我同时设置框架和转换,则只会出现此问题。
同时为视图移动和旋转动画的正确方法是什么?
答案 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;
}
我遇到了同样的问题,但做了一些实验并想出了这个解决方案。