动画一个更BEZZIEL曲线



我正在尝试为我用paintcode(出色的应用,btw)制成的bezzier曲线,并在" drawRect"方法中的自定义uiview中绘制。

图纸正常工作,但我想在bezier曲线中为一个点进行动画。

这是我的非工作方法:

-(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。

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

快速编辑只是看到了您的图层代码。您正在混合几个不同的概念。像抽奖,CashApelayer,旧动画代码等...

通过执行下面的方法,您应该能够使此工作。

您无法做到这一点:(您无法动画DrawRect的内容(即,在动画过程中您无法获得多次绘制)。

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

除了您无能为力。

另一个编辑

在此处添加另一个选项。使用CashApelayer做到这一点可能表现很差。您最好使用带有一系列UIIMAGE的UIImageView。

在uiimageview上内置了属性,动画图,动画图等。

可能的解决方案

CAShapeLayerpath属性是动画的,因此您可以使用此属性。

类似...

// 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];

那么,您应该能够这样的路径动画...

- (void)animatePath
{
    [UIView animateWithDuration:2.0
        animations^() {
            self.pathlayer.path = self.endPath;
    }];
}

文档中有很多关于CashApelayer的注释和对路径属性进行动画的说明。

这应该起作用。

另外,摆脱旧动画代码。自ios4.3以来,它已经消失了,您应该使用更新的块动画。

相关内容

  • 没有找到相关文章