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.

War es hilfreich?

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: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top