2012-03-10 10 views
10

画像を含むレイヤーを、センターではなく左上隅に回転したいとします。ドキュメントによると、私はanchorPointプロパティを[0、1]に設定しました。ビューは私の例では50°回転しますが、アニメーションを開始する前に画面上の別のポイントにジャンプします。スキップなしで特定のアンカーポイントでレイヤーを回転するにはどうすればよいですか?

self.shakeTag.layer.anchorPoint = CGPointMake(0.0f, 1.0f); 
[UIView beginAnimations:@"rotate" context:nil]; 
[self.shakeTag.layer setTransform: 
    CATransform3DRotate(CATransform3DIdentity, 
    radians(50.0), 0.0f, 0.0f, 1.0f)]; 
[UIView commitAnimations]; 

radians()は、このように定義される:

static inline double radians (double degrees) {return degrees * M_PI/180;} 

Iは4倍の大きさであり、透明なピクセルをたくさん持っている画像を使用する場合、私は、デフォルトのアンカーポイントでそれを回転させることができる[0.5 、0.5]、私は目に見えないピクセルのためのスペースを無駄にしたくありません。どのようなアイデアをどのように回転が行われる前にジャンプからレイヤーを防ぐことができますか?

+0

あなたは答えが正しいと思うなら、それは次のようになりあなたが受け入れるならば素晴らしい。 – Krumelur

+0

あなたはここで私の答えを見る必要があります:http://stackoverflow.com/a/22188420/550393 – 2cupsOfTech

答えて

20

アンカーポイントを変更すると、ビューの位置が変わります。アンカーポイントを変更し、現在の位置に視点を保持したい場合は、ビューの位置を変更する必要があります。あなたのアンカーポイントを設定し、位置の変化を補償する:(Layer Position jumps at start of (Core) Animationここから撮影):このような何かを使用し

-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view 
{ 
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y); 
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y); 

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform); 
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform); 

    CGPoint position = view.layer.position; 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    view.layer.position = position; 
    view.layer.anchorPoint = anchorPoint; 
} 

また、詳細についてはこちらをご覧ください:Changing my CALayer's anchorPoint moves the view

関連する問題