2013-02-12 12 views
8

注意:これはOS X上のCocoaアプリケーション用であり、iOSではありません。Core Animation:anchorPointを10.8に設定して、レイヤーを中心に回転させます。

私はレイヤバックNSButton(NSViewのサブクラス)を持っています。私がしたいのは、Core Animationを使ってそのボタンを回転させることです。 、これは、それが実行されるとき、その中心点がNSViewのの原点であるように、層がダウンし、左にジャンプことを除いて、作品

CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
a.fromValue = [NSNumber numberWithFloat:0]; 
a.toValue = [NSNumber numberWithFloat:-M_PI*2]; 
[_refreshButton.layer setAnchorPoint:CGPointMake(0.5, 0.5)]; 
a.duration = 1.8; // seconds 
a.repeatCount = HUGE_VAL; 
[_refreshButton.layer addAnimation:a forKey:nil]; 

た:私はそれを行うには、次のコードを使用しています(0,0)の左下隅です。レイヤーはその中心を中心に回転しますが、明らかに左下のジャンプは受け入れられません。

ので、あまり読んだ後、私は10.8 APIのリリースでは、この行を見つけノート:

On 10.8, AppKit will control the following properties on a CALayer 
(both when "layer-hosted" or "layer-backed"): geometryFlipped, bounds, 
frame (implied), position, anchorPoint, transform, shadow*, hidden, 
filters, and compositingFilter. Use the appropriate NSView cover methods 
to change these properties. 

これは、AppKitのは、上記のコードで-setAnchorPointに私の電話を「無視」されていることを意味し、その代わり、ありますアンカーポイントをNSViewの原点(0,0)に設定します。

私の質問は:これをどのように解決すればよいですか?レイヤーのanchorPointを設定するための「適切なNSViewカバーメソッド」(NSViewでこのようなメソッドが見つかりません)とは何ですか?終わりには、ボタンを無期限に中心点を中心に回転させたいだけです。

答えて

15

NSViewには、anchorPointの直接の「カバー」という方法はありません。

私はあなたが引用されたものをほか、the 10.8 release notesに見ています、これです:

anchorPointも常にあることを(0,0)に設定されている、...

anchorPointコントロール層の点はスーパーレイヤの座標系でpositionにあります。 NSViewは、self.layer.anchorPointを(0,0)に設定します。これは、レイヤの左下隅がself.layer.positionにあることを意味します。

anchorPointを(0.5,0.5)に設定すると、レイヤーの中心がレイヤーのpositionにある必要があります。 positionは変更していないので、レイヤーを左下に移動させる効果があります。

あなたが positionあなたはその anchorPointはこのように、(0.5,0.5)であるとき、層が持つようにしたい計算する必要が

CGRect frame = _refreshButton.layer.frame; 
CGPoint center = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)); 
_refreshButton.layer.position = center; 
_refreshButton.layer.anchorPoint = CGPointMake(0.5, 0.5); 
+0

パーフェクト!ええと;私はポジションのプロパティを見ましたが、AppKitがそれを制御しようとしている上記の注釈を読んでいるので、試してみませんでした。ソリューションをありがとう! – Bryan

+0

なぜ回転M_PI/2が最初の時計回りに時計回りに回転するのか? – greg

+0

私はあなたのコードを見なければならないでしょう。あなた自身の質問を投稿するべきです。 –

関連する問題