ios Sprite Kit screengrab?

Sie*_*ult 27 objective-c ios uigraphicscontext sprite-kit swift

我试图获取一个包含SKScene的视图的屏幕抓取.我使用的技术是:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

这适用于普通的UIViews,但无论出于何种原因,它忽略了SKScene中的所有精灵.

我不确定这是否是一个错误,或者Sprite Kit的渲染是否与UIGraphics分开.

问题:当UIViews的工作方式似乎无法与Sprite Kit一起使用时,或者是否有人使用Sprite Kit使用UIGraphics上下文时,如何获取SKScene的屏幕抓取?

Mat*_*att 30

你几乎拥有它,但问题是在上面的评论中解释的.如果你想捕获SKScene内容,请尝试这样的事情:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self.view drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

解决方案是基本上使用新方法drawViewHierarchyInRect:afterScreenUpdates,这是我们现在最好的方法; 请注意,这并不是很快,所以实时做这件事并不是很好.


ABa*_*ith 10

作为一种更快的替代方法,您可以使用textureFromNodeon方法SKView,该方法将视图的图像作为一个返回SKTexture.只需传递SKScene参数:

let texture = skView.textureFromNode(scene)
Run Code Online (Sandbox Code Playgroud)

或者捕捉部分场景:

let texture = skView.textureFromNode(scene, crop: cropRect)
Run Code Online (Sandbox Code Playgroud)