Wie kann ich einen Inhalt Schalter in einem NSImageView animieren?
-
04-10-2019 - |
Frage
Ich möchte das Bild in einem NSImageView
gezeigt wechseln, aber ich möchte, dass der Wandel animieren. Ich habe verschiedene Methoden versucht, dies zu tun. Hoffentlich einer von euch könnte man vorschlagen, die tatsächlich funktionieren könnte. Ich arbeite mit Cocoa für Mac.
Lösung
Sie können Ihre eigene benutzerdefinierte Ansicht implementieren, die ein Core Animation CALayer
verwendet das Bild zu speichern. Wenn Sie die contents
Eigenschaft der Schicht festgelegt, wird das Bild automatisch glatt belebter aus dem alten Bild auf den neuen.
Andere Tipps
Soweit ich weiß, NSImageView
nicht unterstützt Animieren Bild ändert. Sie können jedoch ein zweites NSImageView
oben auf dem ersten und belebtes legen die alte versteckt und das neue zeigt. 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 Sie Ihre Ansicht ist groß und Sie können 10.5+ benötigen, dann könnte man das Gleiche mit Core Animation tun, welche Hardware beschleunigt wird und viel weniger CPU verwenden.
Nach newImageView Erstellen von 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 ändern müssen abbrechbare sein, aber ich werde nicht für Sie alle Ihre Code schreiben: -)