Явная анимация NSView с использованием базовой анимации

Я пытаюсь вставить 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 , а также возможность установить делегата. Любая помощь будет принята с благодарностью.

7
задан Andriy 3 April 2013 в 08:35
поделиться