动画bezier曲线点

时间:2014-01-28 17:55:55

标签: ios animation uibezierpath paint-code

我尝试使用Paintcode(很棒的应用程序,顺便说一句)制作bezier曲线的动画,并在" drawRect"中绘制自定义UIView。方法

绘图工作正常,但我想在贝塞尔曲线中为单个点设置动画。

这是我的非工作方法:

-(void)animateFlame{
    NSLog(@"Animating");
    // Create the starting path. Your curved line.
    //UIBezierPath * startPath;
    // Create the end path. Your straight line.
    //UIBezierPath * endPath = [self generateFlame];
    //[endPath moveToPoint: CGPointMake(167.47, 214)];

    int displacementX = (((int)arc4random()%50))-25;
    int displacementY = (((int)arc4random()%30))-15;
    NSLog(@"%i %i",displacementX,displacementY);

    UIBezierPath* theBezierPath = [UIBezierPath bezierPath];
    [theBezierPath moveToPoint: CGPointMake(167.47, 214)];
    [theBezierPath addCurveToPoint: CGPointMake(181+displacementX, 100+displacementY) controlPoint1: CGPointMake(89.74, 214) controlPoint2: CGPointMake(192.78+displacementX, 76.52+displacementY)];
    [theBezierPath addCurveToPoint: CGPointMake(167.47, 214) controlPoint1: CGPointMake(169.22+displacementX, 123.48+displacementY) controlPoint2: CGPointMake(245.2, 214)];
    [theBezierPath closePath];
    // Create the shape layer to display and animate the line.
    CAShapeLayer * myLineShapeLayer = [[CAShapeLayer alloc] init];

    CABasicAnimation * pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
    pathAnimation.fromValue = (__bridge id)[bezierPath CGPath];
    pathAnimation.toValue = (__bridge id)[theBezierPath CGPath];
    pathAnimation.duration = 0.39f;
    [myLineShapeLayer addAnimation:pathAnimation forKey:@"pathAnimation"];

    bezierPath = theBezierPath;
}

使用此功能,屏幕上根本没有任何动作。生成的随机位移是好的,bezierPath变量是用类范围声明的UIBezierPath。

我错过了什么吗? (目标是做一种类似蜡烛的动画)

1 个答案:

答案 0 :(得分:3)

快速修改 刚看到你的图层代码。您正在混合几个不同的概念。像drawRect,CAShapeLayer,旧动画代码等...

通过以下方法,您应该能够正常工作。

你不能这样做:(你不能为drawRect的内容设置动画(即你不能让它在动画过程中多次绘制)。

您可以使用计时器或其他东西,并创建自己的动画类型代码。 (即创建一个每秒触发30次的计时器并运行一个函数来计算你在动画中的位置并更新你想要更改的值并调用[self setNeedsDisplay];来触发draw rect方法。

除此之外,你无能为力。

另一个编辑

在这里添加另一个选项。使用CAShapeLayer执行此操作可能会导致性能非常差。您可能最好使用带有一系列UIImages的UIImageView。

在UIImageView上有内置属性,animationImages,animationDuration等。

可能的解决方案

path的{​​{1}}属性是可动画的,因此您可以使用此属性。

像...一样的东西。

CAShapeLayer

然后你应该能够像这样设置路径动画......

// set up properties for path
@property (nonatomic, assign) CGPath startPath;
@property (nonatomic, assign) CGPath endPath;
@property (nonatomic, strong) CAShapeLayer *pathLayer;

// create the startPath
UIBezierPath *path = [UIBezierPath //create your path using the paint code code
self.startPath = path.CGPath;

// create the end path
path = [UIBezierPath //create your path using the paint code code
self.endPath = path.CGPath;

// create the shapee layer
self.pathLayer = [CAShapeLayer layer];
self.pathLayer.path = self.startPath;
//also set line width, colour, shadows, etc...

[self.view.layer addSubLayer:self.pathLayer];

有关CAShapeLayer和动画路径属性的文档中有很多注释。

这应该可行。

另外,摆脱旧的动画代码。自iOS4.3以来,你应该使用更新的块动画。