Iphone 如何设置动画UIImageView的初始方向?

Iphone 如何设置动画UIImageView的初始方向?,iphone,Iphone,我正在为iphone应用程序编程一个仪表显示:一个居中的指针UIImageView和一个固定的背景UIImageView。我是iPhone编程新手,对CoreAnimation不太了解,但通过查看示例并在InterfaceBuilder中摆弄我的锚点设置和针图像在背景中的位置,我的针会找到我所需的旋转点,正确地居中于背景中: self.needleIV.layer.anchorPoint = CGPointMake( 0.5, 0.68 ); 使用以下代码,我的测试动画工作正常(指针保持在仪表

我正在为iphone应用程序编程一个仪表显示:一个居中的指针UIImageView和一个固定的背景UIImageView。我是iPhone编程新手,对CoreAnimation不太了解,但通过查看示例并在InterfaceBuilder中摆弄我的锚点设置和针图像在背景中的位置,我的针会找到我所需的旋转点,正确地居中于背景中:

self.needleIV.layer.anchorPoint = CGPointMake( 0.5, 0.68 );
使用以下代码,我的测试动画工作正常(指针保持在仪表的正确中心,并围绕我所需的旋转点(锚定点)旋转):

CABasicAnimation *rotateAnimation = [CABasicAnimation animation];
rotateAnimation.keyPath = @"transform.rotation.z";
rotateAnimation.fromValue = [NSNumber numberWithFloat:DegreesToRadians( (rand() % 270 - 135) )];
rotateAnimation.toValue = [NSNumber numberWithFloat:DegreesToRadians( (rand() % 270 - 135) )];
rotateAnimation.duration = 4.0;
rotateAnimation.removedOnCompletion = NO;
// leaves presentation layer in final state; preventing snap-back to original state
rotateAnimation.fillMode = kCAFillModeBoth; 
rotateAnimation.repeatCount = 0;
rotateAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

// Add the animation to the selection layer. This causes it to begin animating. 
[self.needleIV.layer addAnimation:rotateAnimation forKey:@"rotateAnimation"];  
问题是,在应用程序启动时,指针最初指向正上方(这是指针在图像文件中的外观),我不知道如何给它一个初始旋转值,而该值不会弄乱动画代码。(我所说的“混乱”是指指针没有在正确的轴上旋转,并且在仪表中变得不居中)

我尝试将layer.transform设置为绕z轴旋转的3d旋转矩阵,但这会使针偏离中心。我也尝试过这段代码:

[self.needleIV.layer setValue:[NSNumber numberWithFloat:DegreesToRadians(-135.0)] forKeyPath:@"transform.rotation.z"];
这也不起作用(针头离开了主播点中心),我对它寄予厚望,因为它显然对正在工作的动画代码使用了相同的变换

我还尝试将工作动画片段放在我的视图控制器的viewDidLoad函数中,将指针“动画化”到它的开始位置,但它什么都不做——显然,直到图像实际出现在屏幕上,动画才会运行,我已经在调试器中确认,viewDidLoad中的屏幕仍然是黑色的


在这一点上,我将尝试在应用程序开始设置正确旋转针的动画后,插入一个计时器来运行初始动画“足够长的时间”,但我真的很想了解这里出了什么问题,为什么动画显然是围绕一个不同的轴旋转,而不是我在预旋转/预动画中的其他尝试。

锚点相对于父对象的边界。viewDidLoad后,父层/视图的边界是否可能更改


您应该能够使用UIView center和transform属性完成所有这些操作,它们是二维的,因此隐式地绕z轴旋转。

锚点相对于父对象的边界。viewDidLoad后,父层/视图的边界是否可能更改


您应该能够使用UIView center和transform属性完成所有这些操作,它们是二维的,因此隐式地绕z轴旋转。

不,父对象没有改变,我认为这不是问题所在。同样,CABASICANIATION完全围绕我指定的锚点旋转(在视图中是相对0-1坐标,而不是从文档中可以看出的父坐标系)。似乎我上面提到的所有“问题”旋转都忽略了主播点。我现在的解决方案是:我对图像进行了黑客攻击,添加了更透明的垂直空间,将我想要的旋转点移动到图像的中心,然后一切都“正常”。“layer.anchorPoint”是否仅用于CoreAnimation例程?视图有一个中心,层有一个anchorPoint。主要的价值在于,它们独立于变换,因为旋转和平移是不可交换的。那么我也许应该用不同的方式来阐述我的整个问题:“将二维UIImageView放置在其superview内的任意位置,围绕某个内部点进行初始旋转,然后围绕同一点进行进一步旋转的动画制作,以便无论superview内的位置如何,旋转都以相同的方式发生,正确的方法是什么?”“不,父母没有改变,我想这不是问题所在。同样,CABASICANIATION完全围绕我指定的锚点旋转(在视图中是相对0-1坐标,而不是从文档中可以看出的父坐标系)。似乎我上面提到的所有“问题”旋转都忽略了主播点。我现在的解决方案是:我对图像进行了黑客攻击,添加了更透明的垂直空间,将我想要的旋转点移动到图像的中心,然后一切都“正常”。“layer.anchorPoint”是否仅用于CoreAnimation例程?视图有一个中心,层有一个anchorPoint。主要的价值在于,它们独立于变换,因为旋转和平移是不可交换的。那么我也许应该用不同的方式来阐述我的整个问题:“将二维UIImageView放置在其superview内的任意位置的正确方法是什么,使其围绕某个内部点进行初始旋转,然后围绕同一点设置进一步旋转的动画,以便无论superview内的位置如何,旋转都以相同的方式发生。”。