0

我的视图/层层次结构如下所示:

CustomUIView  [A]
  |
  +--- UIImageView [B]

首次显示 UI 时,视图 [B] 显示默认图像(游戏板)。

作为对用户事件的反应,我创建了一些CALayer对象并将它们作为子层添加到 view[A]的支持层。然后我使用它们来渲染动画,在视觉上改变游戏板的部分,因为它们在层次上位于图像视图的顶部。这工作得很好。

动画完成后,我想截取生成的图层状态的屏幕截图,将其设置为新图像,[B]然后在游戏中的下一步移动之前丢弃临时子图层。

我的代码如下所示:

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    UIImage *snapshot = [self.view snapshot];
    self.snapshotVIew.image = snapshot;
    for (CALayer *tileLayer in tempLayers)
    {
        [tileLayer removeFromSuperlayer];
    }
}];

CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations =@[contentAnimation, zoom];
animGroup.duration = 0.5f;
animGroup.removedOnCompletion = NO;
animGroup.fillMode = kCAFillModeForwards;
for (CALayer* tileLayer in tempLayers)
{
    [tileLayer addAnimation:animGroup forKey:nil];
}
[CATransaction commit];

我的自定义视图的快照方法非常标准:

- (UIImage*) snapshot {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, [[UIScreen mainScreen] scale]);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage* img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

问题似乎是renderInContext的文档说:

将接收器及其子层渲染到指定的上下文中。此方法直接从层树渲染,忽略添加到渲染树的任何动画

由于最后一个突出显示的句子,一旦层被删除,一切看起来都和以前一样。显然,当完成块运行时,图层树似乎没有更新完成动画状态,所以我的截图没有考虑到这一点。

我该怎么做呢?

4

1 回答 1

2

尝试渲染图层的presentationLayer:

[self.layer.presentationLayer renderInContext:UIGraphicsGetCurrentContext()];

或者,不要使用 removedOnCompletion = NO,而是在添加动画后将图层的属性设置为其最终状态。然后当动画完成时,图层将反映更改后的外观,您可以渲染正常图层。

于 2012-06-25T18:23:17.767 回答