Ios 如何将视图发送到后台,使其位于主视图后面?

Ios 如何将视图发送到后台,使其位于主视图后面?,ios,swift,Ios,Swift,客观的 我想在主视图后面隐藏AVCaptureSession,这样它就隐藏在UIViewController下,因为用户看不到它 显然,AVCaptureVideoPreviewLayer是CALayer的一个子类,我们使用它来显示被输入设备捕获的视频 代码 这是我用来开始会话的代码。代码开始AVCaptureSession并使用previewLayer将其帧放置在视图的一个层中 var err : NSError? = nil captureSession.addInput(AVCap

客观的

我想在主视图后面隐藏AVCaptureSession,这样它就隐藏在UIViewController下,因为用户看不到它

显然,AVCaptureVideoPreviewLayer是CALayer的一个子类,我们使用它来显示被输入设备捕获的视频

代码

这是我用来开始会话的代码。代码开始AVCaptureSession并使用previewLayer将其帧放置在视图的一个层中

var err : NSError? = nil
    captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))

    if err != nil {
        println("error: \(err?.localizedDescription)")
    }

    var previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)


    self.view.layer.addSublayer(previewLayer)
    previewLayer?.frame = self.view.layer.frame
    captureSession.startRunning()
问题:

其他人建议使用view.sendSubviewToBackcameraView,但我不知道如何在代码中实现它。如何将会话的框架放置在主视图后面,使其隐藏

前面提到的sendSubviewToBack方法仅适用于视图,因为您有图层,因此需要不同的解决方案

你所需要的是一种类似于

self.view.layer.insertSublayer(previewLayer, atIndex: 0)
这将插入预览层作为当前层层次结构中的第一层

或者,如果希望将图层添加到self.view.layer后面,则需要像self.view.layer.superlayer一样获得self.view.layer的父/超级图层,并在那里添加子视图

关于索引0的澄清 索引0将导致层成为第一个显示/渲染的层。如果在索引1处有一个跨越屏幕3/4的层,则在其余1/4处,索引0处的层将可见。 如果通过常规addSublayer/addSubview添加视图或层,它将作为视图层次结构中最新也是最后一个对象插入,即索引最高的对象,即最后渲染的对象。

上述sendSubviewToBack方法仅适用于视图,您有层,因此需要不同的解决方案

你所需要的是一种类似于

self.view.layer.insertSublayer(previewLayer, atIndex: 0)
这将插入预览层作为当前层层次结构中的第一层

或者,如果希望将图层添加到self.view.layer后面,则需要像self.view.layer.superlayer一样获得self.view.layer的父/超级图层,并在那里添加子视图

关于索引0的澄清 索引0将导致层成为第一个显示/渲染的层。如果在索引1处有一个跨越屏幕3/4的层,则在其余1/4处,索引0处的层将可见。
如果您通过常规addSublayer/addSubview添加视图或层,它将作为视图层次结构中最新也是最后一个对象插入,即索引最高的对象,最后一个对象。

感谢您的回答,非常感谢!不完全是,索引0表示它是第一个被渲染的,这意味着它将被放置在后面,因为其他所有内容都被放置在它上面。非常感谢您的澄清。有没有其他方法可以完全隐藏图层?previewLayer似乎与UIViewController的视图混淆了。我现在可以同时看到主视图的对象,如UILabels、UIImages和previewLayer。有什么办法可以绕过这个问题吗?请编辑我之前的评论*:是的,你实际上提到了self.view.layer.superlayer。你能告诉我如何得到父超层吗?非常感谢。我真的很感谢你的帮助!您可以将其不透明度设置为0或隐藏为true,但我不知道这对实际的AVCapture有什么影响。问题是为什么你想把图层添加到你的视图中却看不到它。谢谢你的回答,非常感谢!不完全是,索引0表示它是第一个被渲染的,这意味着它将被放置在后面,因为其他所有内容都被放置在它上面。非常感谢您的澄清。有没有其他方法可以完全隐藏图层?previewLayer似乎与UIViewController的视图混淆了。我现在可以同时看到主视图的对象,如UILabels、UIImages和previewLayer。有什么办法可以绕过这个问题吗?请编辑我之前的评论*:是的,你实际上提到了self.view.layer.superlayer。你能告诉我如何得到父超层吗?非常感谢。我真的很感谢你的帮助!您可以将其不透明度设置为0或隐藏为true,但我不知道这对实际的AVCapture有什么影响。问题是为什么要将图层添加到视图中,但却无法看到它。