2010-05-08 60 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

相關問題