0

我正在编写一个应用程序(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) 生成。我想为这条路径的显示设置动画,使其在绘制时缓慢出现几秒钟 - 最简单和最快的方法是什么?

4

1 回答 1

2

“慢慢出现”是什么意思?我假设您的意思不是立即全部淡入,而是意味着您希望它看起来像是用笔绘制的路径?

为此,请执行以下操作:

创建一个与视图大小相同的 CAShapeLayer,并将其添加为视图的子层。从您的贝塞尔路径中获取 CGPath。

将 CGPath 安装到 shapeLayer 中。

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

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

于 2013-03-09T14:09:17.643 回答