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 にインストールします。

シェイプ レイヤーの strokeEnd プロパティの値を 0.0 から 1.0 にアニメーション化する CABasicAnimation を作成します。これにより、シェイプが最初から最後までトレースされているかのように描画されます。おそらく、単一の連続したサブパスを含むパスが必要です。折り返して接続したい場合は、閉じたパスにします。

シェイプ レイヤーやパスの変更をアニメーション化することで、あらゆる種類のクールなトリックを実行できます。パス自体をアニメーション化する場合は、開始パスと終了パスが内部的に同じ数の制御点を持つようにする必要があります。(パスの円弧は、円弧の角度によってパスの制御点の数が異なるため、注意が必要です。)

于 2013-03-09T14:09:17.643 に答える