我想切换 中显示的图像NSImageView
,但我想为该更改设置动画。我尝试了各种方法来做到这一点。希望你们中的一个人可以提出一个可能真正有效的建议。我正在使用 Cocoa for Mac。
问问题
4340 次
2 回答
7
据我所知,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];
}
您需要将上述内容修改为可中止,但我不会为您编写所有代码:-)
于 2010-05-09T01:59:31.300 回答
5
You could implement your own custom view that uses a Core Animation CALayer
to store the image. When you set the contents
property of the layer, the image will automatically smoothly animate from the old image to the new one.
于 2010-05-09T02:29:00.543 回答