我正在使用CAKeyframeAnimation在圆轨迹上移动CALayer。有时我需要停止动画并将动画移动到动画停止的位置。这里的代码:
CAKeyframeAnimation* circlePathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGMutablePathRef circularPath = the circle path;
circlePathAnimation.path = circularPath;
circlePathAnimation.delegate = self;
circlePathAnimation.duration = 3.0f;
circlePathAnimation.repeatCount = 1;
circlePathAnimation.fillMode = kCAFillModeForwards;
circlePathAnimation.removedOnCompletion = NO;
circlePathAnimation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:.43 :.78 :.69 :.99];
[circlePathAnimation setValue:layer forKey:@"animationLayer"];
[layer addAnimation:circlePathAnimation forKey:@"Rotation"];
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
CALayer *layer = [anim valueForKey:@"animationLayer"];
if (layer) {
CALayer *presentationLayer = layer.presentationLayer;
layer.position = presentationLayer.position;
}
}
但是表示层的位置没有变化!!!我读到它在ios 8中不再可靠。那么还有其他方法可以找到动画层的当前位置吗?
最佳答案
我不知道表示层的position属性停止告诉您iOS 8中该层的位置。这很有趣。在表示层上使用hitTest方法进行命中测试仍然有效,我只是在前一段时间编写的应用程序上进行过尝试。
暂停和恢复动画仍然有效。
对于简单的路径(例如圆形路径),您可以检查动画的时间,然后使用Trig计算位置。
对于更复杂的路径,您必须了解图层所遍历的路径。随时间绘制单个三次或二次贝塞尔曲线非常简单,但是要弄清楚其中混合了不同形状的复杂UIBezierPath / CGPath会比较麻烦。
关于ios - CAKeyFrameAnimation表示层似乎未更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29451279/