2013-08-16 27 views
3

美好的一天,每個人!無法設置動畫時長

嗯,我有一個非常簡單的麻煩。 我有一個帶有兩個子層的CATransformLayer,每個子層都帶有「false」doubleSided屬性,並且形成一個雙面卡。 問題是,我無法設置動畫持續時間或任何其他選項,例如,UIViewAnimationCurveEaseInOut等。 我嘗試了新的和舊的方法來向我的圖層添加動畫選項和持續時間,但不幸的是,它旋轉0,25秒,作爲默認值狀態。怎麼了?任何建議,將不勝感激。

下面的代碼:

1)的所有東西初始化:

#ifndef SUPPORTED_MACRO 
    #define DEGREES_TO_RADIANS(angle) (angle * M_PI/180.0) 
    #endif 
    - (void)viewDidLoad 
    { 
      [super viewDidLoad]; 

      [super viewDidLoad]; 

      CATransformLayer *cardContainer = [CATransformLayer layer]; 
      cardContainer.anchorPoint = CGPointMake(0.5 , 1.0) ; 
      cardContainer.position = CGPointMake(100.0, 200.0) ; 
      cardContainer.bounds = CGRectMake(0.0, 0.0, 150.0, 170.0); 

      CALayer *cardFront = [CALayer layer]; // the front part of card 
      cardFront.bounds = CGRectMake(0.0, 0.0, cardContainer.bounds.size.width,  cardContainer.bounds.size.height) ; 
      cardFront.frame = cardContainer.bounds ; 
      cardFront.contentsGravity = kCAGravityResizeAspect ; 
      cardFront.borderColor = [UIColor blackColor].CGColor; 
      cardFront.borderWidth = 2.0; 
      cardFront.cornerRadius = 30.0; 
      [cardContainer addSublayer:cardFront]; 

      CALayer *cardBack = [CALayer layer]; //back part of card 
      cardBack.bounds = CGRectMake(0.0, 0.0, cardContainer.bounds.size.width, cardContainer.bounds.size.height) ; 
      cardBack.frame  = cardContainer.bounds; 
      cardBack.contentsGravity = kCAGravityResizeAspect ; 
      cardBack.borderColor = [UIColor blackColor].CGColor; 
      cardBack.borderWidth = 2.0; 
      cardBack.cornerRadius = 30.0; 
      cardBack.doubleSided = NO; 

cardBack.transform = CATransform3DMakeRotation(DEGREES_TO_RADIANS(180.0),0.0,1.0,0.0); 
[cardContainer addSublayer:cardBack]; 

((CALayer*)[cardContainer.sublayers objectAtIndex:0]).contents = (id)[UIImage imageNamed:@"1.png"].CGImage ; 
((CALayer*)[cardContainer.sublayers objectAtIndex:1]).contents = (id)[UIImage imageNamed:@"2.png"].CGImage ; 

      TL = cardContainer ; 
      [self.view.layer addSublayer:cardContainer]; 

} 

2)程序旋轉(在一個過時的風格):

-(void)Rotate 
    { 
      static double CallCounter = 1.0 ; 

      auto CATransform3D t3d = CATransform3DIdentity; 
      t3d.m34 = 1.0/-500.0; 

      [UIView beginAnimations:nil context:NULL]; 
      [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
      [UIView setAnimationDuration:1.75]; 
      TL.sublayerTransform = CATransform3DRotate(t3d, -(CallCounter*M_PI) , 1.0, 0.0, 0.0) ; 
      [UIView commitAnimations]; 

      CallCounter += 1.0 ; 

} 
+0

你打電話從哪裏轉來轉去? – Liron

+0

從以下例程: - (無效)的touchesBegan:(NSSet中*)觸摸withEvent:方法(的UIEvent *)事件 { [自旋轉]; } –

+0

另外,如果你在調用'setAnimationCurve'之前調用'setAnimationDuration'? – Liron

回答

2

好,問題很簡單。事情是,不是一個對象的每個屬性都可以是動畫的。因爲變換屬性的想法是產生

TL.sublayerTransform = CATransform3DRotate(t3d, -(CallCounter*M_PI) , 1.0, 0.0, 0.0) ; 

:例如,我們不能動畫這個表達式:

int *a = (int*) malloc (5 * sizeof (int)) ; 

或者這樣:

int x = 5 ; 

或者,最後,這一個矩陣,它將被寫入sublayerTransfrom類字段。而且,基本上對於編譯器來說,它與malloc調用是相同的表達式,或者初始化x變量 - 這是一個分配操作。看起來像,CATransformLayer類有某種檢查器,只有當屬性更改它的值時纔會調用該檢查器。 Cocoa會在屬性更改時自動發送消息。通過鍵值觀察機制。

所以,要動畫這個非動畫屬性,我決定使用CATransaction塊。在這種情況下他們真的很有幫助。希望有人會發現這篇文章有用!對不起,我的英語,我來自俄羅斯)