我的视图/层层次结构如下所示:
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
的文档说:
将接收器及其子层渲染到指定的上下文中。此方法直接从层树渲染,忽略添加到渲染树的任何动画。
由于最后一个突出显示的句子,一旦层被删除,一切看起来都和以前一样。显然,当完成块运行时,图层树似乎没有更新完成动画状态,所以我的截图没有考虑到这一点。
我该怎么做呢?