2010-05-08 85 views

回答

5

您可以实现自己的自定义视图,该视图使用Core Animation CALayer来存储图像。当您设置图层的contents属性时,图像会自动从旧图像平滑地动画到新图像。

+1

听起来不错。但我该怎么做? – 2010-05-09 02:50:42

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+,那么你可以做核心动画同样的事情,这将是硬件加速和占用更少的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]; 
} 

你需要修改上面是中止的,但我不打算写所有的代码为你:-)

+0

我希望能够强制动画在中间停下来;那可能吗? – 2010-05-09 02:45:57

+0

当然,如果您使用NSAnimationNonblocking或NSAnimationNonblockingThreaded,并在某处保留对NSViewAnimation对象的引用,则可以调用[动画stopAnimation],然后将视图以任何您想要的方式放回。 – 2010-05-09 02:47:32

+0

好吧,我试图做到这一点,但它真的很波涛汹涌。你知道如何做Rob Keniger的方法吗?这似乎是最简单的。 – 2010-05-09 02:56:59

相关问题