2012-09-24 44 views
0

我有一個車速表窗口小部件,在我的應用程序中使用自定義動畫創建,我有問題將其設置爲我想要的動畫方式。xCode旋轉動畫車速表

根據傳入的值選擇動畫到一個特定的點。它的取值範圍是0 - 50.所以如果取值爲50,那麼選擇將會一直旋轉到右邊,它將保持爲左手邊。然而,我想要在選秀開始時始終保持動態,然後回到正確的位置。這是我遇到問題的部分。

暫時我硬編碼所有的值僅用於測試目的。

該選擇在開始的中心,所以我需要讓它看起來向左旋轉。

image.transform = CGAffineTransformRotate(image.transform, -0.8); 

然後,我需要它動畫的最右邊,所以我用這個

[UIView animateWithDuration:2.0 delay:0 options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 

         image.transform = CGAffineTransformRotate(image.transform, 1.7); 


        } 
        completion:nil]; 

這工作得很好,因此應用程序啓動時,挑會從左邊開始,然後旋轉所有正確的方式。

問題是當我加入

這最後一部分,那麼我需要它從右邊回到它需要是點旋轉。暫時我把它設置在中心。

[UIView animateWithDuration:2.0 delay:2.0 options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 

         image.transform = CGAffineTransformRotate(image.transform, -0.8); 


        } 
        completion:nil]; 

當應用程序啓動時,在拾取的右手側開始關閉,然後旋轉到中心。它忽略了它應該開始向左旋轉的第一部分。

有誰知道爲什麼會發生這種情況?一直在這個多年來,似乎無法弄清楚。

編輯:我試着堅持在這裏

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ 

     }); 

從左至右拾將動畫代碼裏最終的動畫,但當時它只是從右邊跳到中心點,而不是動畫的中心點:@

嘗試這樣:

-(void) animateToEnd : (UIImageView *)image 
{ 

    [UIView animateWithDuration:2.0 delay:0 options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 

         image.transform = CGAffineTransformRotate(image.transform, 1.7); 
         image.transform = CGAffineTransformIdentity; 


        } 
        completion:nil]; 
} 
-(void) animateToFinalPosition : (UIImageView *)image 
{ 

    [UIView animateWithDuration:2.0 delay:2.0 options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 


         image.transform = CGAffineTransformRotate(image.transform, -0.8); 
       image.transform = CGAffineTransformIdentity; 

        } 
        completion:nil]; 
} 


-(void) speedometer : (UIImageView *)image 
{ 
    image.transform = CGAffineTransformRotate(image_p.transform, -0.8); 




    [self animateToEnd:image]; 
    [self animateToFinalPosition:image]; 


} 

它忽略了左到右的動畫,並從最左邊

剛剛開始

已修復的問題。改變了動畫這一

-(void) animateToEnd : (UIImageView *)image_p 
{ 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:2.0]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

    image_p.transform = CGAffineTransformRotate(image_p.transform, 1.7); 

    [UIView commitAnimations]; 


} 
-(void) animateToPosition : (UIImageView *)image_p : (float)temp 
{ 

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ 

      NSLog(@"Dispatch"); 
      [UIView beginAnimations:nil context:nil]; 
      [UIView setAnimationDuration:2.0]; 
      [UIView setAnimationDelay:0.0]; 
      [UIView setAnimationDelegate:self]; 
      [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

      image_p.transform = CGAffineTransformRotate(image_p.transform, -temp); 

      [UIView commitAnimations]; 
     }); 

} 

我用之前該塊代碼似乎會導致

+0

這個問題不是真的關於Xcode。 – 2012-09-24 13:56:32

+0

我刪除了標籤 – AdamM

+0

我會考慮爲此使用coreanimation,因爲它內置了對重複動畫的支持。 –

回答

1

你施加另一旋轉之前重置identitymatrix問題:

image.transform = CGAffineTransformIdentity; 

如果it's不重置,然後每個旋轉應用在前一個頂部。這可能是你問題的一部分。

+0

我明白你的意思了,但我不希望它每次都重置,我希望它從最後動畫的位置繼續。所以當它從左向右旋轉時,它會保存該位置,然後下一個動畫從該位置開始。我會怎麼做? – AdamM

+0

通過設置標識矩陣保存當前位置。然後從當前狀態開始應用下一次旋轉。在你的代碼中試一下,告訴我會發生什麼。 –

+0

試過了,它似乎忽略了第二個動畫仍然是, – AdamM