2013-02-12 54 views
1

當按下按鈕時,我有一個UIImageView在屏幕上運行。當按下按鈕時,將更改UIImageView的UIImage,並且當按鈕鬆開後,將其更改爲其原始UIImage。當圖像變回時,它會回到圖像開始的位置。當按下按鈕當UIImage更改時捕捉動畫

此計時器被稱爲:

//This is the image that changes when the button is pressed. 
imView.image = image2; 
runTimer = [NSTimer scheduledTimerWithTimeInterval:0.04 
              target:self 
              selector:@selector(perform) 
              userInfo:nil 
              repeats:YES]; 

這被稱爲當按鈕停止正在舉行:

- (IBAction)stopPerform:(id)sender{ 
    [runTimer invalidate]; 

    //THIS IS WHAT SNAPS THE ANIMATION BACK: 
    //Without this the animation does not snap back 
    imView.image = image1; 
} 

- (void)performRight{ 

CGPoint point0 = imView.layer.position; 
CGPoint point1 = { point0.x + 4, point0.y }; 

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position.x"]; 
anim.fromValue = @(point0.x); 
anim.toValue = @(point1.x); 
anim.duration = 0.2f; 
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 

// First we update the model layer's property. 
imView.layer.position = point1; 

// Now we attach the animation. 
[imView.layer addAnimation:anim forKey:@"position.x"]; 
} 

我需要的圖像添加到動畫中的變化?如果是這樣如何?我真的很困惑。

回答

0

核心動畫使用不同組的屬性來表示對象:

Core Animation Programming Guide


模型層樹(或簡稱爲「層樹」)是您的應用進行交互的那些最多。此樹中的對象是存儲任何動畫的目標值的模型對象。無論何時更改圖層的屬性,都可以使用這些對象之一。

演示樹包含任何正在運行的動畫的正在播放的值。儘管圖層樹對象包含動畫的目標值,但表示樹中的對象反映了屏幕上顯示的當前值。你不應該修改這個樹中的對象。相反,您可以使用這些對象來讀取當前的動畫值,也許可以從這些值開始創建一個新的動畫。


所以,當你動畫的屬性更改表現層,但一旦動畫完成的對象恢復到它的模型屬性值。

你需要做什麼來解決這個問題是使用[CAAnimation animationDidStop:finished:]委託方法來設置最終的屬性值和任何你想做的事情。我想你可以用它來轉儲你正在使用的那個可怕的NSTimer代碼,並且世界的一小部分會好得多。

+0

NSTimer是我知道如何進行按住的唯一方法。你會怎麼做? – Tanner 2013-02-12 22:10:05

+0

@Tanner我認爲計時器正在用於與動畫同步;如果不是,那就不用擔心。 – trojanfoe 2013-02-12 22:34:59

+0

我有另一個問題抱歉,我將如何使用animationDidStop ...來更改imageView上的UIImage?它需要一個CAAnimation,但我只能使用aCABasicAnimation或完成塊更改圖像。謝謝 – Tanner 2013-02-12 22:45:16