2012-03-08 66 views
9

我是新來的objective-c,我想添加一個圖像到屏幕上,像在AS3中一樣補間,將它從一端移動到另一端同時圍繞自己的中心點旋轉。動畫旋轉/縮放/同時轉換UIImage

我試着用

[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!

+0

可能值得檢查一下http://www.apeth.com/iOSBook/ch17.html – 2012-03-08 17:53:30

+0

這對我來說不是很清楚......問題在於轉換嗎?或者你只想要轉換後右上角的座標? – Saphrosit 2012-03-08 18:32:02

+0

對不起,如果我不夠清楚。問題在於旋轉不在圖像的中心附近。旋轉中心似乎不隨着平移而移動,以便圖像的最終位置取決於其尺寸。結果整個事情在iPad和iPhone上看起來不同。 – headkit 2012-03-08 22:45:31

回答

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]; 
+0

像魅力一樣工作!謝謝 – MasterRazer 2013-11-20 21:22:10

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