4

我想在 NSImageView 中为 png 序列设置动画,但我无法使其工作。它只是不想显示任何动画。有什么建议吗?

这是我的代码:

- (void) imageAnimation {
  NSMutableArray *iconImages = [[NSMutableArray alloc] init];
  for (int i=0; i<=159; i++) {
    NSString *imagePath = [NSString stringWithFormat:@"%@_%05d",@"clear",i];
    [iconImages addObject:(id)[NSImage imageNamed:imagePath]];
    //NSImage *iconImage = [NSImage imageNamed:imagePath];
    //[iconImages addObject:(__bridge id)CGImageCreateWithNSImage(iconImage)];
  }


  CALayer *layer = [CALayer layer];
  CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
  [animation setCalculationMode:kCAAnimationDiscrete];
  [animation setDuration:10.0f];
  [animation setRepeatCount:HUGE_VALF];
  [animation setValues:iconImages];

  [layer setFrame:NSMakeRect(0, 0, 104, 104)];
  layer.bounds = NSMakeRect(0, 0, 104, 104);
  [layer addAnimation:animation forKey:@"contents"];

  //Add to the NSImageView layer
  [iconV.layer addSublayer:layer];
}
4

2 回答 2

5
tl;博士:

通过调用使您的视图层托管

[iconV setLayer:[CALayer layer]];
[iconV setWantsLayer:YES];

为什么什么也没发生

没有发生任何事情的原因是您的图像视图没有图层,因此当您调用时,[iconV.layer addSublayer:layer];您正在向其发送消息nil并且没有任何反应(子图层未添加到图像视图中)。

默认情况下,OS X 上的视图不使用 Core Animation 层作为它们的后备存储,以实现向后兼容性。带有层的视图可以是layer-backedlayer-hosting

您不应该直接与支持图层的视图进行交互,也不应该将视图(但可以添加图层)添加到图层托管视图。由于您要将图层添加到图像视图图层(并因此直接与其交互),因此您需要一个图层托管视图。

修复它

你可以告诉你的视图它应该是层托管的,首先给它层使用[iconV setLayer:[CALayer layer]];,然后(顺序很重要)告诉它它想要一个层使用[iconV setWantsLayer:YES];

有关 layer-backed 和 layer-hosting 视图的更多信息,请阅读wantsLayer.

于 2012-10-22T13:41:53.157 回答
0

我迟到了,但我会发布我的解决方案,因为原来的一个加上@David 发布的答案对我不起作用。我在 Xcode 8.3.3 上创建,为 10.10 编译。

对我不起作用的是单独创建图层,然后用它设置图像视图。

这对我不起作用

CALayer *layer = [CALayer layer];
layer.frame = self.imageView.bounds;
layer.bounds = self.imageView.bounds;
[self.imageView setLayer:layer];

结果总是没有动画。

显然,在 10.10 上,当你这样做时:

self.imageView.wantsLayer = YES;

MacOS 创建一个图层并将其分配给图像视图。

所以,对我有用的代码是:

self.imageView.wantsLayer = YES;

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
[animation setCalculationMode:kCAAnimationDiscrete];
[animation setDuration:1.3f];
[animation setRepeatCount:HUGE_VALF];
[animation setValues:imageArray];
[self.imageView.layer addAnimation:animation forKey:@"contents"];  
[self.imageView setAnimates:YES];

[self.imageView setCanDrawSubviewsIntoLayer:YES];

最后一行非常重要。如果您删除它,它将不会显示任何图像!

于 2017-08-01T22:15:05.523 回答