Cocoa touch 跟踪核心动画
我有两个圆圈在屏幕上移动。这些圆都是包含其他UIView的UIView。每个圆外的区域是透明的 我已经写了一个函数来创建一个CGPath,它用一个四边形连接两个圆。我用一个横跨整个屏幕的透明玻璃层填充这条路径。由于该层位于两个圆形UIView的后面,因此似乎将它们连接起来 最后,使用核心动画为两个UIView设置动画。在该动画期间,两个圆的位置和大小都会发生变化 到目前为止,我唯一成功的方法是使用NSTimer定期中断动画,然后根据圆的presentationLayer的位置重新计算并绘制梁。但是,当动画加速时,四边形落后于圆Cocoa touch 跟踪核心动画,cocoa-touch,core-animation,Cocoa Touch,Core Animation,我有两个圆圈在屏幕上移动。这些圆都是包含其他UIView的UIView。每个圆外的区域是透明的 我已经写了一个函数来创建一个CGPath,它用一个四边形连接两个圆。我用一个横跨整个屏幕的透明玻璃层填充这条路径。由于该层位于两个圆形UIView的后面,因此似乎将它们连接起来 最后,使用核心动画为两个UIView设置动画。在该动画期间,两个圆的位置和大小都会发生变化 到目前为止,我唯一成功的方法是使用NSTimer定期中断动画,然后根据圆的presentationLayer的位置重新计算并绘制梁。
有没有更好的方法来实现这一点,使用核心动画?或者我应该避免核心动画并使用NSTimer实现我自己的动画吗?如果需要查找层的当前可见状态,可以在相关的CALayer上调用
-presentationLayer
,这将为您提供一个近似于用于渲染的层。请注意,我说的是近似值-不能保证完全准确。不过,对于您的目的来说,它可能已经足够好了。我也遇到了类似的问题。我在动画中使用了层而不是视图。你可以试试这样的
对于圆,您可能可以使用CALayers并设置内容(如果是图像),标准方式为:
layer.contents = [UIImage imageNamed:@"circle_image.png"].CGImage;
现在,对于四元层,将CALayer子类化,并通过以下方式实现:
- (void)drawInContext:(CGContextRef)theContext{
//Custom draw code here
}
+ (BOOL)needsDisplayForKey:(NSString *)key{
if ([key isEqualToString:@"customprop"])
return YES;
return [super needsDisplayForKey:key];
}
该交易看起来像:
[CATransaction begin];
CABasicAnimation *theAnimation=[CABasicAnimation animationWithKeyPath:@"customprop"];
theAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1000, 1000)];
theAnimation.duration=1.0;
theAnimation.repeatCount=4;
theAnimation.autoreverses=YES;
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
theAnimation.delegate = self;
[lay addAnimation:theAnimation forKey:@"selecting"];
[CATransaction setValue:[NSNumber numberWithFloat:10.0f]
forKey:kCATransactionAnimationDuration];
circ1.position=CGPointMake(1000, 1000);
circ2.position=CGPointMake(1000, 1000);
[CATransaction commit];
现在所有的抽签程序将同时进行。确保您的drawInContext:实现是快速的。否则,动画将延迟
将每个子层添加到UIView的层后,请记住调用[layer setNeedsDisplay]。它不会被自动调用
我知道这有点复杂。但是,生成的动画比每次调用时使用NSTimer和重画要好。正如我提到的,我已经尝试使用presentationLayer,但它落后于圆圈。我需要一种更可靠的方法来同步多个组件的动画。我能想到的唯一可靠的方法是连接动画机器。您可以考虑使用CAShapeLayer并与圆圈同步设置其路径的动画。对于那些选择实现完全编程动画而不是使用自定义属性的人,请注意:不要为此使用
NSTimer
;这将是缓慢和CPU贪婪。对于任何与动画相关的内容,请使用,它与屏幕刷新率同步,并由CoreAnimation内部使用。