gpt4 book ai didi

cocoa-touch - 跟踪核心动画动画

转载 作者:行者123 更新时间:2023-12-04 00:57:34 25 4
gpt4 key购买 nike

我有两个围绕屏幕移动的圆圈。圆圈都是包含其他 UIViews 的 UIViews。每个圆圈外的区域是透明的。

我已经编写了一个函数来创建一个 CGPath,它将两个圆与四边形连接起来。我在跨越整个屏幕的透明 CALayer 中填充了这条路径。由于该层在两个圆形 UIViews 的后面,它似乎将它们连接起来。

最后,使用 Core Animation 对两个 UIView 进行动画处理。 位置和尺寸在此动画期间,两个圆圈的数量都会发生变化。



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

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

最佳答案

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

  • 将每个元素绘制为 CALayer,并将它们包含为容器 UIVIew 层的子层。 UIViews 更容易制作动画,但你的控制权会减少。请注意,对于任何 View ,您都可以使用 [view layer]; 获取它的图层。
  • 为您的四边形创建一个自定义子图层。这个图层应该有一个或几个你想要为这个图层设置动画的属性。我们称这个属性为“customprop”。因为是自定义层,所以要在动画的每一帧上重绘。对于您计划制作动画的属性,您的自定义图层类应返回 YES NeedDisplayForKey:。这样你就可以确保 -(void)drawInContext:(CGContextRef)theContext 每一帧都被调用。
  • 将所有动画(圆形和四边形)放在同一个事务中;


  • 对于圆圈,您可能可以使用 CALayer 并设置内容,如果是图像,则标准方式:
    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: 实现速度很快。否则动画会滞后。

    将每个子图层添加到 UIViews 的图层后,记得调用 [layer setNeedsDisplay]。它不会被自动调用。

    我知道这有点复杂。但是,生成的动画比使用 NSTimer 并在每次调用时重绘要好。

    关于cocoa-touch - 跟踪核心动画动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4272694/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com