2010-05-08 12 views

cevap

5

Görüntüyü depolamak için Çekirdek Animasyon CALayer'u kullanan kendi özel görünümünüzü uygulayabilirsiniz. Katmanın contents özelliğini ayarladığınızda, görüntü otomatik olarak eski görüntüden yenisine doğru pürüzsüz hale gelir.

+1

Bu kulağa hoş geliyor. Bunu nasıl yaparım? –

7

Bildiğim kadarıyla, NSImageView animasyonlu görüntü değişikliklerini desteklemiyor. Ancak, birincinin üstüne ikinci bir NSImageView yerleştirebilir ve eskisini gizleyerek ve yenisini göstererek canlandırabilirsiniz. Örneğin: görünümü büyük olduğunu ve 10.5 ve üzeri gerektirebilir

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]; 

, o zaman donanım hızlandırmalı olmak ve çok daha az CPU kullanacak Core animasyon aynı şeyi yapabilirdi.

newImageView oluşturduktan sonra, böyle bir şey yapmak:

[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]; 
} 

Sen abortable olmak için yukarıdaki değiştirmeniz gerekir, ama senin için tüm kod yazmak için gitmiyorum :-)

+0

Animasyonu ortada durmaya zorlamak istiyorum; mümkün mü? –

+0

NSAnimationNonblocking veya NSAnimationNonblockingThreaded komutunu kullanırsanız ve NSViewAnimation nesnesine bir yerde bir referans verirseniz, [animasyonu durdurma] özelliğini çağırabilir ve sonra istediğiniz şekilde geri görünümler ekleyebilirsiniz. –

+0

Tamam, bunu yapmaya çalıştım, ama gerçekten garipti. Rob Keniger'ın yöntemini nasıl yapacağını biliyor musun? Bu en basit gözüküyor. –

İlgili konular