我正在使用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){
}];
有没有办法获得旋转的当前值?
感谢。
答案 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];
}];
}