Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 跟踪核心动画_Cocoa Touch_Core Animation - Fatal编程技术网

Cocoa touch 跟踪核心动画

Cocoa touch 跟踪核心动画,cocoa-touch,core-animation,Cocoa Touch,Core Animation,我有两个圆圈在屏幕上移动。这些圆都是包含其他UIView的UIView。每个圆外的区域是透明的 我已经写了一个函数来创建一个CGPath,它用一个四边形连接两个圆。我用一个横跨整个屏幕的透明玻璃层填充这条路径。由于该层位于两个圆形UIView的后面,因此似乎将它们连接起来 最后,使用核心动画为两个UIView设置动画。在该动画期间,两个圆的位置和大小都会发生变化 到目前为止,我唯一成功的方法是使用NSTimer定期中断动画,然后根据圆的presentationLayer的位置重新计算并绘制梁。

我有两个圆圈在屏幕上移动。这些圆都是包含其他UIView的UIView。每个圆外的区域是透明的

我已经写了一个函数来创建一个CGPath,它用一个四边形连接两个圆。我用一个横跨整个屏幕的透明玻璃层填充这条路径。由于该层位于两个圆形UIView的后面,因此似乎将它们连接起来

最后,使用核心动画为两个UIView设置动画。在该动画期间,两个圆的位置和大小都会发生变化

到目前为止,我唯一成功的方法是使用NSTimer定期中断动画,然后根据圆的presentationLayer的位置重新计算并绘制梁。但是,当动画加速时,四边形落后于圆


有没有更好的方法来实现这一点,使用核心动画?或者我应该避免核心动画并使用NSTimer实现我自己的动画吗?

如果需要查找层的当前可见状态,可以在相关的CALayer上调用
-presentationLayer
,这将为您提供一个近似于用于渲染的层。请注意,我说的是近似值-不能保证完全准确。不过,对于您的目的来说,它可能已经足够好了。

我也遇到了类似的问题。我在动画中使用了层而不是视图。你可以试试这样的

  • 将每个元素绘制为CALayer,并将其作为容器UIVIew层的子层包含。UIView更容易设置动画,但您的控制能力会降低。请注意,对于任何视图,都可以使用[view layer]获取其图层
  • 为四边形创建自定义子层。该层应具有一个或多个要为此层设置动画的特性。让我们将此属性称为“customprop”。因为它是一个自定义层,所以需要在动画的每个帧上重新绘制。对于要设置动画的特性,自定义图层类应返回YES needsDisplayForKey:。这样可以确保-(void)drawintext:(CGContextRef)context在每个帧上都被调用
  • 将所有动画(圆形和四边形)放在同一事务中
    对于圆,您可能可以使用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内部使用。