NSView
コアアニメーションを使用してスライドしようとしています。のようなものに頼るのではなく、明示的なアニメーションを使用する必要があると思います[[view animator] setFrame:newFrame]
。これは主に、アニメーションの終了後にアクションを実行するためにアニメーションデリゲートを設定する必要があるためです。
アニメーターを使用して問題なく動作していますが、前述したように、アニメーションが終了したときに通知を受ける必要があります。私のコードは現在次のようになっています:
// Animate the controlView
NSRect viewRect = [controlView frame];
NSPoint startingPoint = viewRect.origin;
NSPoint endingPoint = startingPoint;
endingPoint.x += viewRect.size.width;
[[controlView layer] setPosition:NSPointToCGPoint(endingPoint)];
CABasicAnimation *controlPosAnim = [CABasicAnimation animationWithKeyPath:@"position"];
[controlPosAnim setFromValue:[NSValue valueWithPoint:startingPoint]];
[controlPosAnim setToValue:[NSValue valueWithPoint:endingPoint]];
[controlPosAnim setDelegate:self];
[[controlView layer] addAnimation:controlPosAnim forKey:@"controlViewPosition"];
これは視覚的には機能しますが(最後に通知が届きます)、実際のcontrolViewは移動しないようです。ウィンドウを更新すると、controlViewが消えます。交換してみました
[[controlView layer] setPosition:NSPointToCGPoint(endingPoint)];
と
[controlView setFrame:newFrame];
これにより、ビュー(およびレイヤー)が移動しますが、何かが破損しているため、アプリがすぐにセグメンテーション違反で停止します。
明示的なアニメーションの例のほとんどは、を動かしているだけのようですCALayer
。を移動しNSView
、代理人を設定できる方法が必要です。どんな助けでもいただければ幸いです。