2012-08-24 42 views
2

我正在使用animateWithDuration讓我的UIVIew中有一個無限旋轉。現在,我需要在特定時間獲取我UIView旋轉的當前值。 我試着用下面的函數:animateWithDuration期間的旋轉當前值

-(float)getCurrentRotation{ 
CGAffineTransform transform = ((UIImageView*)[self.subviews objectAtIndex:0]).transform; 
return (atan2(transform.b, transform.a)); 
} 

但它總是返回相同的值(M_PI/2),因爲它是我在我的初始調用指定animateWithDuration值:

[UIView animateWithDuration:4 delay:0 options:(UIViewAnimationOptionRepeat|UIViewAnimationOptionCurveLinear) animations:^{ 
    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI/2); 
    ((UIImageView*)[self.subviews objectAtIndex:0]).transform = transform; 
} 
       completion:^(BOOL finished){ 
       }]; 

有沒有辦法讓旋轉的當前值?

謝謝。

回答

2

當使用基於CoreAnimation動畫,你查看屬性(邊界,變換...)從來沒有真正改變。在動畫設計中顯示在屏幕上的圖層屬性有哪些變化(請參閱this documentation page),可使用view.layer.presentationLayer訪問該屬性。

因此,下面的行會得到你要求它的時候,你實際的變換:

CGAffineTransform transform = CATransform3DGetAffineTransform([(CALayer*)[[[self.subviews objectAtIndex:0] layer] presentationLayer] transform]); 

您必須對連接和包括QuartzCore框架,它定義CALayer,爲此工作。

#import <QuartzCore/QuartzCore.h> 
+0

工作,謝謝! –

0

我不確定是否可以在屏幕上顯示「旋轉值」。但我會說這不是,因爲您的視圖對象確實立即擁有新的屬性值,並且動畫發生在您無法觸及的對象框架的深處。

爲了實現您的目標,我會將旋轉分離爲單個步驟,其粒度足以滿足您的需求。然後只計算步驟並使當前步驟可用。可能看起來有點像這樣(沒有測試過,只是亂寫):

//step and rotator declared as class members 
//rotator is the one which is referred to as ((UIImageView*)[self.subviews objectAtIndex:0]) in the original question 
-(CGFloat)currentRotation 

{ 
    return step*(M_PI/16); 
} 

-(void)turnturnturn 
{ 
    [UIView animateWithDuration:0.2 
        animations:^ 
        { 
        rotator.transform = CGAffineTransformConcat(CGAffineTransformMakeRotation(M_PI/16), rotator.transform); 
        step++; 
        } 
        completion:^(BOOL finished) 
        { 
        if(step == 32) 
        { 
         step = 0; 
         rotator.transform = CGAffineTransformIdentity; 
        } 
        [self turnturnturn]; 
        }]; 
}