Cocoa 如何在NSImageView中设置内容切换的动画?
我想切换Cocoa 如何在NSImageView中设置内容切换的动画?,cocoa,macos,animation,nsimageview,Cocoa,Macos,Animation,Nsimageview,我想切换NSImageView中显示的图像,但我想设置该更改的动画。我尝试过各种方法来做到这一点。希望你们中的一位能够提出一个可能真正有效的方案。我正在使用Cocoa for Mac。据我所知,NSImageView不支持图像更改动画。但是,您可以在第一个视图的顶部放置第二个NSImageView,并设置动画以隐藏旧视图并显示新视图。例如: NSImageView *newImageView = [[NSImageView alloc] initWithFrame: [imageView fra
NSImageView
中显示的图像,但我想设置该更改的动画。我尝试过各种方法来做到这一点。希望你们中的一位能够提出一个可能真正有效的方案。我正在使用Cocoa for Mac。据我所知,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+,那么您可以对核心动画执行相同的操作,这将是硬件加速,并且使用更少的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];
}
您需要修改以上内容以使其可中止,但我不会为您编写所有代码:-)您可以实现自己的自定义视图,该视图使用核心动画
CALayer
来存储图像。当你设置图层的<代码>内容< /代码>属性时,图像将自动平滑地从旧图像动画化到新图像。我希望能够强制动画停止在中间;这是可能的吗?当然,如果您使用NSanimationBlocking或NSanimationBlockingThreaded并在某处保留对NSViewAnimation对象的引用,您可以调用[animation stopAnimation],然后以您想要的方式将视图放回。好吧,我尝试过这样做,但它确实很不稳定。你知道怎么用Rob Keniger的方法吗?这似乎是最简单的。我注意到NSAnimationNonblockingThreaded似乎比NSAnimationNonblocking更平滑(因为它不是基于runloop的)。如果NSAnimationNonblockingThreaded仍然很慢,那么您尝试设置多大尺寸的图像动画?您知道如何使用Rob Keniger的方法吗?