如何使UIBezierPath绘图动画显示为缓慢而不是立即显示?

时间:2013-03-07 22:09:52

标签: animation ios6 core-animation

我正在编写一个应用程序(XCode 4.6),它显示各种不同路径的图形 - 现在它只是直线和贝塞尔路径,但最终会变得更复杂。我目前没有使用任何图层,显示实际上非常简单。

我的drawRect代码如下所示:

- (void)drawRect:(CGRect)rect :(int) points :(drawingTypes) type //:(Boolean) initial
{
    //CGRect bounds = [[UIScreen mainScreen] bounds];
    CGRect appframe= [[UIScreen mainScreen] applicationFrame];


    CGContextRef context = UIGraphicsGetCurrentContext();


    _helper = [[Draw2DHelper alloc ] initWithBounds :appframe.size.width  :appframe.size.height :type];

    CGPoint startPoint = [_helper generatePoint] ;

    [_uipath moveToPoint:startPoint];
    [_uipath setLineWidth: 1.5];

    CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);

    CGPoint center = CGPointMake(self.center.y, self.center.x) ;

    [_helper createDrawing :type :_uipath :( (points>0) ? points : defaultPointCount) :center];


    [_uipath stroke];
}


- (void)drawRect:(CGRect)rect
{
    if (_uipath == NULL)
       _uipath = [[UIBezierPath alloc] init];
    else
        [_uipath removeAllPoints];

    [self drawRect:rect  :self.graphPoints :self.drawingType ];
}

实际路径由辅助对象(_helper)生成。我希望动画显示这条路径,以便在绘制时缓慢显示几秒钟 - 这是最简单,最快速的方法吗?

1 个答案:

答案 0 :(得分:2)

你是什么意思“慢慢出现?”我假设你并不是指一次性淡化,而是意味着你希望它看起来像用笔画出的路径?

为此,请执行以下操作:

创建与视图大小相同的CAShapeLayer,并将其添加为视图的子图层。 从你的bezier路径获取CGPath。

将CGPath安装到shapeLayer中。

创建一个CABasicAnimation,将形状图层的strokeEnd属性的值设置为0.0到1.0。这将导致绘制形状,就好像从头到尾一样。您可能想要一个包含单个连续子路径的路径。如果您希望它回转并连接,请将其设置为封闭路径。

您可以使用形状图层和动画更改路径来执行各种很酷的技巧。它的设置(如strokeStart和strokeEnd,stokeColor,fillColor等)如果为路径本身设置动画,则必须确保开始路径和结束路径在内部具有相同数量的控制点。 (并且路径弧很棘手,因为路径具有不同数量的控制点,具体取决于弧的角度。)