Как я могу анимировать коммутатор контента в NSImageView?

Я хочу переключить изображение, показанное в NSImageView, но я хочу анимировать то изменение. Я попробовал различные методы, чтобы сделать это. Надо надеяться, один из Вас мог предложить тот, который мог бы на самом деле работать. Я работаю с Какао для Mac.

6
задан Alexsander Akers 8 May 2010 в 22:27
поделиться

2 ответа

Вы можете реализовать собственное пользовательское представление, использующее Core Animation CALayer для хранения изображения. При установке свойства contents слоя изображение будет автоматически плавно анимироваться со старого изображения на новое.

5
ответ дан 9 December 2019 в 20:40
поделиться

Насколько мне известно, 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];
}

Вам нужно будет изменить приведенное выше, чтобы его можно было прервать, но я не собираюсь писать за вас весь ваш код: -)

7
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: