同时动画旋转/缩放/翻译UIImage

时间:2012-03-08 17:35:46

标签: objective-c ios animation rotation translation

我是Objective-c的新手,我想在屏幕上添加一个图像,像在AS3中一样补间,在围绕自己的中心点旋转的同时将其从一端移动到另一端。

我试过

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            // TRANSFORM SCREENSHOT
            screenShotView.transform = CGAffineTransformRotate(screenShotView.transform, -M_PI * 0.05);
            screenShotView.transform = CGAffineTransformScale(screenShotView.transform, 0.6, 0.6);
            screenShotView.transform = CGAffineTransformTranslate(screenShotView.transform, 
                                                                  self.webView.frame.origin.x,
                                                                  self.webView.frame.origin.y - self.webView.frame.size.height * 0.3
                                        );

但是使用此代码,图像围绕TransformIdentity的中心旋转。因此,旋转和移动时旋转失控,图像并不完全处于我喜欢的位置。

同时旋转和平移的正确方法是什么,将旋转中心与图像进行平移?

并且至少在转换后我想在图像的右上角添加一个关闭按钮。为此,我也需要角落的新坐标。

日Thnx!

2 个答案:

答案 0 :(得分:16)

我现在以下面的代码结束了,但我仍然不知道这是否是最先进的解决方案。

CGAffineTransform translate = CGAffineTransformMakeTranslation(self.webView.frame.origin.x,self.webView.frame.origin.y - self.webView.frame.size.height * 0.25);
CGAffineTransform scale = CGAffineTransformMakeScale(0.6, 0.6);
CGAffineTransform transform =  CGAffineTransformConcat(translate, scale);
transform = CGAffineTransformRotate(transform, degreesToRadians(-10));

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

    screenShotView.transform = transform;

[UIView commitAnimations];

答案 1 :(得分:7)

IOS 7的首选方法是使用块对象。与“老式”动画方式相比,它有几个优点。特别是它可以利用多核和视频协同处理。此外,“内置”回调部分(完成部分)非常有用,因为它可以根据需要保留任何必要的状态信息和指向对象的链接。

CGAffineTransform translate = CGAffineTransformMakeTranslation(self.webView.frame.origin.x,self.webView.frame.origin.y - self.webView.frame.size.height * 0.25);
CGAffineTransform scale = CGAffineTransformMakeScale(0.6, 0.6);
CGAffineTransform transform =  CGAffineTransformConcat(translate, scale);
transform = CGAffineTransformRotate(transform, degreesToRadians(-10));

// animation using block code
[UIView animateWithDuration:2.0
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                     screenShotView.transform = transform;
                 }completion:^(BOOL finished){
                     // do something if needed
                 }];