Я хочу переключить изображение, показанное в NSImageView
, но я хочу анимировать то изменение. Я попробовал различные методы, чтобы сделать это. Надо надеяться, один из Вас мог предложить тот, который мог бы на самом деле работать. Я работаю с Какао для Mac.
Вы можете реализовать собственное пользовательское представление, использующее Core Animation CALayer
для хранения изображения. При установке свойства contents
слоя изображение будет автоматически плавно анимироваться со старого изображения на новое.
Насколько мне известно, NSImageView
не поддерживает анимацию изменений изображения. Однако вы можете разместить второй NSImageView
поверх первого и анимировать, скрывая старый и показывая новый. Например:
NSImageView *newImageView = [[NSImageView alloc] initWithFrame: [imageView frame]];
[newImageView setImageFrameStyle: [imageView imageFrameStyle]];
// anything else you need to copy properties from the old image view
// ...or unarchive it from a nib
[newImageView setImage: [NSImage imageNamed: @"NSAdvanced"]];
[[imageView superview] addSubview: newImageView
positioned: NSWindowAbove relativeTo: imageView];
[newImageView release];
NSDictionary *fadeIn = [NSDictionary dictionaryWithObjectsAndKeys:
newImageView, NSViewAnimationTargetKey,
NSViewAnimationFadeInEffect, NSViewAnimationEffectKey,
nil];
NSDictionary *fadeOut = [NSDictionary dictionaryWithObjectsAndKeys:
imageView, NSViewAnimationTargetKey,
NSViewAnimationFadeOutEffect, NSViewAnimationEffectKey,
nil];
NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:
[NSArray arrayWithObjects: fadeOut, fadeIn, nil]];
[animation setAnimationBlockingMode: NSAnimationBlocking];
[animation setDuration: 2.0];
[animation setAnimationCurve: NSAnimationEaseInOut];
[animation startAnimation];
[imageView removeFromSuperview];
imageView = newImageView;
[animation release];
Если у вас большой вид и вам может потребоваться 10.5+, то вы можете сделать то же самое с Core Animation, которая будет иметь аппаратное ускорение и потреблять намного меньше CPU.
После создания newImageView сделайте что-нибудь вроде:
[newImageView setAlphaValue: 0];
[newImageView setWantsLayer: YES];
// ...
[self performSelector: @selector(animateNewImageView:) withObject: newImageView afterDelay: 0];
- (void)animateNewImageView:(NSImageView *)newImageView;
{
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration: 2];
[[newImageView animator] setAlphaValue: 1];
[[imageView animator] setAlphaValue: 0];
[NSAnimationContext endGrouping];
}
Вам нужно будет изменить приведенное выше, чтобы его можно было прервать, но я не собираюсь писать за вас весь ваш код: -)