Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何在NSImageView中设置内容切换的动画?_Cocoa_Macos_Animation_Nsimageview - Fatal编程技术网

Cocoa 如何在NSImageView中设置内容切换的动画?

Cocoa 如何在NSImageView中设置内容切换的动画?,cocoa,macos,animation,nsimageview,Cocoa,Macos,Animation,Nsimageview,我想切换NSImageView中显示的图像,但我想设置该更改的动画。我尝试过各种方法来做到这一点。希望你们中的一位能够提出一个可能真正有效的方案。我正在使用Cocoa for Mac。据我所知,NSImageView不支持图像更改动画。但是,您可以在第一个视图的顶部放置第二个NSImageView,并设置动画以隐藏旧视图并显示新视图。例如: NSImageView *newImageView = [[NSImageView alloc] initWithFrame: [imageView fra

我想切换
NSImageView
中显示的图像,但我想设置该更改的动画。我尝试过各种方法来做到这一点。希望你们中的一位能够提出一个可能真正有效的方案。我正在使用Cocoa for Mac。

据我所知,
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];
}

您需要修改以上内容以使其可中止,但我不会为您编写所有代码:-)

您可以实现自己的自定义视图,该视图使用核心动画
CALayer
来存储图像。当你设置图层的<代码>内容< /代码>属性时,图像将自动平滑地从旧图像动画化到新图像。

我希望能够强制动画停止在中间;这是可能的吗?当然,如果您使用NSanimationBlocking或NSanimationBlockingThreaded并在某处保留对NSViewAnimation对象的引用,您可以调用[animation stopAnimation],然后以您想要的方式将视图放回。好吧,我尝试过这样做,但它确实很不稳定。你知道怎么用Rob Keniger的方法吗?这似乎是最简单的。我注意到NSAnimationNonblockingThreaded似乎比NSAnimationNonblocking更平滑(因为它不是基于runloop的)。如果NSAnimationNonblockingThreaded仍然很慢,那么您尝试设置多大尺寸的图像动画?您知道如何使用Rob Keniger的方法吗?