我正在尝试为我用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上内置了属性,动画图,动画图等。
可能的解决方案
CAShapeLayer
的path
属性是动画的,因此您可以使用此属性。
类似...
// 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以来,它已经消失了,您应该使用更新的块动画。