NSView Удалить после анимации

Я не знаю, почему это оказывается так сложно, но в основном я хочу анимировать NSView на моем экране, и как только эта анимация будет выполнена, удалите этот NSView. Однако кажется, что я не могу найти абсолютно никакой ссылки на то, как это сделать. Может кто-нибудь помочь?

Я начинаю свою анимацию так

NSRect frame = blob.frame;
frame.origin.x = animationStopX;
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:timeToDisappear];
[[blob animator] setFrame:frame];
[NSAnimationContext endGrouping];

У меня нет возможности получить обратный вызов после его завершения или чего-то еще.


person MZimmerman6    schedule 28.04.2012    source источник


Ответы (2)


Сразу после оператора beginGrouping добавьте следующее:

[[NSAnimationContext currentContext] setCompletionHandler:^{
        [self.blob removeFromSuperview];
    }];

setCompletionHandler: — это метод класса NSAnimationContext.

person rdelmar    schedule 28.04.2012
comment
ой человек я бы хотел, чтобы я видел это несколько дней назад. В итоге я создал отдельный цикл выполнения, который просто анализировал и проверял некоторые свойства. Если были соблюдены определенные условия, я удалял объект. Я буду иметь это в виду в следующий раз, когда я попытаюсь сделать что-то подобное. - person MZimmerman6; 01.05.2012
comment
setCompletionHandler доступен для OS X 1.7 и более поздних версий. - person RocketMan; 25.07.2012
comment
Имейте в виду, что «setCompletionHandler» будет вызываться, даже если анимация была «отменена», то есть если у вас есть событие, запускающее другой вызов метода, который анимирует «блоб», и в его «setCompletionHandler» вы [self.view addSubview self. blob], вы можете фактически повесить свое приложение в SpinLock ИЛИ получить нежелательные результаты, такие как удаление представления, даже если вы только что добавили его. Это связано с тем, что приложение может приостановить mainThread, отдать приоритет другому диспетчерскому вызову и вызвать два «блока отмены» не по порядку. - person strange; 12.09.2013

В случае, если 10.6 или ниже (и, следовательно, completionHandler NSAnimationContext) не является вариантом, этот подход просто использует блоки и будет работать на 10.6+:

   double delayInSeconds = 1.0;
   dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
   dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
      [mySubView removeFromSuperview];
   });
person Jay    schedule 26.04.2013