2011-12-14 14 views
9

円を作成してスケーリングをアニメートすることはできますが、円の中心位置は同じ点にとどめることができます。このコードは、円の中心を下方向と右方向に移動させ、フレームの上端と左端の境界線のように見えます。円の尺度をアニメートして中心位置を維持する

このレイヤーは、別のレイヤー上のマスクを見ることができます。

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddEllipseInRect(path, nil, CGRectMake(400, 400, 1000, 1000)); 

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
[shapeLayer setPath:path]; 
[shapeLayer setFrame:[glView frame]]; 
[shapeLayer setFillColor:[[UIColor blackColor] CGColor]]; 

[[glView layer] setMask:shapeLayer]; 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.0, 0.0, 0)]; 
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 
animation.duration = 3; 
[shapeLayer addAnimation:animation forKey:@"transform.scale"]; 

答えて

6

層は、デフォルトでは、レイヤのフレームの中心でそのアンカーポイント、周囲にスケーリングされます。これはCore Animation Programming Guide - Specifying a Layer's Geometryで説明されています。

サークルの中心がレイヤのアンカーポイントと同じポイントにないことが問題です。

だからあなたの問題を解決する一つの方法は、このように、円の中心と同じになるようにshapeLayer.anchorPointを移動することです:

CGRect circleFrame = CGRectMake(400, 400, 1000, 1000); 
CGPoint circleAnchor = CGPointMake(CGRectGetMidX(circleFrame)/CGRectGetMaxX(circleFrame), 
    CGRectGetMidY(circleFrame)/CGRectGetMaxY(circleFrame)); 
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:circleFrame]; 

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.path = path.CGPath; 
shapeLayer.anchorPoint = circleAnchor; 
shapeLayer.frame = glView.frame; 
shapeLayer.fillColor = [UIColor blackColor].CGColor; 

glView.layer.mask = shapeLayer; 
// and then your animation code 

あなたはアンカーポイントを設定したいあなたは、フレームを設定前に、理由フレームを設定した後にアンカーポイントを設定すると、フレームが変更されます。

+4

私はさまざまなanchorPOintを試しましたが、まだ変更はありません。常に左隅にアニメートされます。 – Tariq

+0

Rob Mayoffは正しいです。フレームの中央を各次元の最大値で割って、単位座標空間でアンカーポイントを計算する方法に注意してください。したがって、アンカーポイントは0.0〜1.0の値でなければなりません。 – erikprice

+0

ほとんどの場合、ここのように 'anchorPoint'を変更したくないということを付け加えたいと思います。あなたはちょうど適切なフレームを設定する必要があります。たとえば、パスを使用して形状を作成し、それを拡大縮小します。まず、原点 'x:0、y:0'を持つrectで形状を作成します。次に、このパスを 'CAShapeLayer'に設定したら、frameを設定してレイヤーをレイアウトする必要があります。 CGRectMake(400,400,1000,1000)のように、必要に応じてフレームを設定します。あなたのスケールはポイントx、y = 400 + 1000/2 = 900からです。 –

1

これらは推測ではなく、現時点で自分を試してみてくださいすることができます:それは、それが属するビューの座標系であるべきなglViewのbounds

  • 設定shapeLayerのフレームではなく、frame、スーパービューではありません。
  • shapeLayerのanchorPointを0.5,0.5に設定する - これはCALayer(レイヤーの中央を意味します)のデフォルトですが、フレーム/境界のものが原因ではない限り、これはシェイプレイヤーではありません問題。
関連する問題