2012-04-11 2 views
3

У меня есть NSAnimationContext (просто прокрутка), который я хотел бы замедлить и/или приостановить всякий раз, когда курсор входит в представление. Я уже реализовал обнаружение, когда это происходит - теперь мне просто нужно выяснить, как замедлить анимацию, которая уже выполняется. Я выяснил, как это сделать с CALayers, но мне нужно использовать прокси-сервер аниматора, который не может использовать несколько представлений AppKit в этой анимации, поэтому Core Animation не будет работать. Кто-нибудь знает как это сделать? Есть ли способ отслеживать NSAnimationContexts, а затем изменить их позже?Замедление или приостановка NSAnimationContext

Вот подраздел моего кода. Первый блок циклически называется. Каждый раз, когда завершается одно завершение, начинается следующее.

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ 
    context.duration = pixels/speed; 
    [[currentTweetView animator] setFrame:endRect]; 
} completionHandler:^{ 
    [currentTweetView removeFromSuperview]; 
    currentTweetView = nil; 
    [self nextAnimationWithAnimationIndex:currentIndex]; 
}]; 

Вот код в методе mouseEntered:. Всякий раз, когда это называется, ни один завершающий Handler никогда не вызывается, и приложение зависает.

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ 
    [[[self.subviews objectAtIndex:0] animator] setFrame:finalRect]; 
    context.duration = 100.0; 
} completionHandler:^{ 
    NSLog(@"done"); 
}]; 

Кроме того, есть ли способ закончить NSAnimationContext раньше и не вызвать обработчик завершения?

ответ

0

Я думаю, что если вы просто установите свойство через прокси-сервер animator, то под другим NSAnimationContext, он заменит анимацию, которая была в процессе. Это было бы аналогично перенацеливанию анимации (например, новому месту назначения).

+0

Я только что попробовал это, приложение зависает, а вторая анимация никогда не состоится, и приложение просто зависает. – xizor

+1

Странно. Можете ли вы показать, что делаете? –

+0

Можете ли вы попробовать оставить обработчики завершения? Это что-то меняет? Кроме того, во втором случае вы не хотите устанавливать продолжительность перед выполнением '-setFrame:'? –

Смежные вопросы