2

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

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

但它总是返回与我在初始调用 animateWithDuration 时指定的值相同的值 (M_PI/2):

[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){
                 }];

有没有办法获得当前的旋转值?

谢谢。

4

2 回答 2

2

当使用基于 CoreAnimation 的动画时,您的视图属性(边界、变换...)实际上永远不会改变。动画时屏幕上显示的图层属性发生了哪些变化(请参阅此文档页面),可使用view.layer.presentationLayer.

因此,以下行将在您请求时为您提供实际的转换:

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

您必须链接并包含QuartzCore定义 的框架,CALayer才能使其正常工作。

#import <QuartzCore/QuartzCore.h>
于 2012-08-24T14:16:48.413 回答
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];
                   }];
}
于 2012-08-24T10:59:52.970 回答