如何在Swift中为VR Headset并排渲染相同的UIView内容(相机预览和图层)为两个UIViews

时间:2017-02-17 00:54:21

标签: ios opengl-es

我发现了一个问题: How to show side by side two previews of camera in iOS objective-C for vr app?

但没有答案。

并且,我正在寻找Swift 3中的解决方案 我还需要在两个预览中渲染相同的额外图层。

因此,我的问题是如何并排镜像UIView来播放相机预览或其他输入视频流?在这个阶段我不需要立体视觉。我只需要并排显示相同的内容。就像是: https://itunes.apple.com/ca/app/3d-fpv-stereoscopic-3d-vr/id1008155528?mt=8

1 个答案:

答案 0 :(得分:2)

我找到了答案!答案是 CAReplicatorLayer
overriding mechanism(这不是很快,但可以很容易地在Swift中重新分解)

使用CAReplicatorLayer自动复制图层。正如文档所说,它将自动创建" ...其子图层(源图层)的指定数量的副本,每个副本可能应用了几何,时间和颜色转换。"

除了简单的几何或颜色转换(Think Photo Booth)之外,如果没有与实时预览的大量交互,这是非常有用的。我经常看到CAReplicatorLayer用作创造反射的方法。效果。

以下是一些复制CACaptureVideoPreviewLayer的示例代码:

Init AVCaptureVideoPreviewLayer

AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[previewLayer setFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width, self.view.bounds.size.height / 4)];

初始化CAReplicatorLayer并设置属性

注意:这将复制实时预览图层*四次**。*

NSUInteger replicatorInstances = 4;

CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
replicatorLayer.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height / replicatorInstances);
replicatorLayer.instanceCount = instances;
replicatorLayer.instanceTransform = CATransform3DMakeTranslation(0.0, self.view.bounds.size.height / replicatorInstances, 0.0);

添加图层

注意:根据我的经验,您需要将要复制的图层作为子图层添加到CAReplicatorLayer。

[replicatorLayer addSublayer:previewLayer];
[self.view.layer addSublayer:replicatorLayer];

缺点

使用CAReplicatorLayer的一个缺点是它处理层复制的所有放置。因此,它将对每个实例应用任何设置转换,并且它将全部包含在其自身内。例如。将无法在两个单独的单元格上复制AVCaptureVideoPreviewLayer。