25

四角形の UIBezierPath を三角形にアニメーション化したいのですが、パス上のビューをアニメーション化するのではなく、パス自体をアニメーション化して、ある形状から別の形状にモーフィングします。パスは CALayer に追加されます

CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.fillColor = [[UIColor whiteColor] CGColor];    
maskLayer.path = [self getRectPath];

-(CGPathRef)getTrianglePath
{
    UIBezierPath* triangle = [UIBezierPath bezierPath];
    [triangle moveToPoint:CGPointZero];
    [triangle addLineToPoint:CGPointMake(width(self.view),0)];
    [triangle addLineToPoint:CGPointMake(0, height(self.view))];
    [triangle closePath];
    return [triangle CGPath];
}

-(CGPathRef)getRectPath
{
    UIBezierPath*rect = [UIBezierPath bezierPathWithRect:self.view.frame];
    return [rect CGPath];
}
4

1 に答える 1

32

私は CoreAnimation の専門家ではありませんが、次のように定義できCABasicAnimationます

CABasicAnimation *morph = [CABasicAnimation animationWithKeyPath:@"path"];
morph.duration = 5;
morph.toValue = (id) [self getTrianglePath];
[maskLayer addAnimation:morph forKey:nil];

path最初の行は、レイヤーのプロパティを変更するアニメーションを定義することを示しています。2 行目はアニメーションに 5 秒かかることを示し、3 行目はアニメーションの最終状態を示します。最後に、レイヤーにアニメーションを追加します。キーはアニメーションの一意の識別子です。つまり、同じキーを持つ 2 つのアニメーションを追加すると、最後のアニメーションだけが考慮されます。このキーは、いわゆる暗黙的なアニメーションをオーバーライドするためにも使用できます。CALayerデフォルトでアニメーション化されるのプロパティがいくつかあります。より正確には、これらのプロパティのいずれかを変更すると、変更は 0.25 の持続時間でアニメーション化されます。

于 2012-06-04T18:44:18.597 に答える