animateWithDuration期间的当前旋转值

时间:2012-08-24 10:26:26

标签: iphone uiviewanimation

我正在使用animateWithDuration使我的一个UIVIew无休止地旋转。现在,我需要在特定时间获取我的UIView旋转的当前值。 我试过使用以下功能:

-(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 个答案:

答案 0 :(得分:2)

使用基于CoreAnimation的动画时,视图属性(bounds,transform ...)实际上永远不会改变。动画制作时屏幕上显示的图层属性会发生什么变化(请参阅this documentation page),可以使用view.layer.presentationLayer进行访问。

因此,以下行将在您提出要求时获得实际转换:

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

您必须链接并包含QuartzCore框架,该框架定义CALayer才能实现此目的。

#import <QuartzCore/QuartzCore.h>

答案 1 :(得分:0)

我不确定在屏幕上显示时是否可以观看“旋转值”。但我会说它不是,因为你的视图对象确实立即拥有 new 属性值,并且动画发生在框架深处的某个地方你无法到达的对象上。

为了实现您的目标,我将轮换分为单个步骤,其粒度足以满足您的需求。然后只计算步骤并使当前步骤可用。看起来有点像这样(没有经过测试,只是一个涂鸦):

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