Ich möchte das Bild in einer NSImageView
gezeigt wechseln, aber ich möchte diese Änderung animieren. Ich habe verschiedene Methoden ausprobiert, um dies zu tun. Hoffentlich könnte einer von euch einen vorschlagen, der tatsächlich funktionieren könnte. Ich arbeite mit Cocoa für Mac.Wie kann ich einen Inhaltswechsel in einem NSImageView animieren?
Antwort
Sie können Ihre eigene benutzerdefinierte Ansicht mit einer Kernanimation CALayer
zum Speichern des Bilds implementieren. Wenn Sie die Eigenschaft contents
der Ebene festlegen, wird das Bild automatisch problemlos vom alten auf das neue Bild animiert.
Soweit ich weiß, unterstützt NSImageView
keine animierten Bildänderungen. Sie können jedoch eine zweite NSImageView
über die erste setzen und animieren, die alte zu verstecken und die neue zu zeigen. Zum Beispiel:
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];
Wenn Ihre Ansicht ist groß und Sie können 10.5+ benötigen, dann könnte man das Gleiche mit Core Animation tun, die Hardware beschleunigt wird und viel weniger CPU verwenden.
Nach newImageView zu schaffen, so etwas wie:
[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];
}
Sie werden die oben sein abbrechbare ändern müssen, aber ich werde nicht alles für Sie, Ihren Code schreiben :-)
Ich möchte in der Lage sein, die Animation in der Mitte zu stoppen; ist das möglich? –
Sicher, wenn Sie NSAnimationNonblocking oder NSAnimationNonblockingThreaded verwenden und irgendwo einen Verweis auf das NSViewAnimation-Objekt behalten, können Sie [animation stopAnimation] aufrufen und die Ansichten dann wie gewünscht zurückstellen. –
Okay, ich habe versucht, das zu tun, aber es war wirklich abgehackt. Weißt du, wie man Rob Kenigers Methode macht? Das scheint die einfachste zu sein. –
Das klingt gut. Wie mache ich das? –