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