gpt4 book ai didi

ios - 如何在完成 block 中正确使用 renderInContext?

转载 作者:行者123 更新时间:2023-11-28 22:54:03 25 4
gpt4 key购买 nike

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

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

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

为了响应用户事件,我创建了一些 CALayer 对象并将它们添加为子层以查看 [A] 的支持层。然后我用它们来渲染动画,在视觉上改变游戏板的部分,因为它们在层次上位于 ImageView 之上。这很好用。

动画完成后,我想截取生成的层状态的屏幕截图,将其设置为 [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];

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

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

问题似乎是 renderInContext 的文档说:

Renders the receiver and its sublayers into the specified context. This method renders directly from the layer tree, ignoring any animations added to the render tree.

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

我该怎么做?

最佳答案

尝试渲染图层的 presentationLayer:

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

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

关于ios - 如何在完成 block 中正确使用 renderInContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com