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