【问题标题】:How to send a view to the background so that it's behind the main view?如何将视图发送到后台,使其位于主视图后面?
【发布时间】:2015-04-16 16:53:48
【问题描述】:

目标

我想在主视图后面隐藏一个AVCaptureSession,以便它隐藏在UIViewController 下,因为它对用户不可见。

显然,AVCaptureVideoPreviewLayerCALayer 的子类,我们用它来显示输入设备正在捕获的视频。

代码

这是我用来开始会话的代码。代码以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.sendSubviewToBack(cameraView),但我不知道如何在我的代码中实现它。如何将会话的框架放在主视图后面,使其隐藏?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    提到的sendSubviewToBack 方法只适用于视图,你有层,因此你需要一个不同的解决方案。

    你需要的是类似于

    的东西
    self.view.layer.insertSublayer(previewLayer, atIndex: 0)
    

    这会将previewLayer 作为当前层层次结构中的第一层插入。

    或者如果你想在self.view.layer后面添加层,你需要像self.view.layer.superlayer一样获取self.view.layer的父/超层并在那里添加子视图。

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

    【讨论】:

    • 感谢您的回答,非常感谢!
    • 并非如此,索引 0 表示它是第一个被渲染的,这意味着它将被放在后面,因为其他所有东西都放在它上面。
    • 非常感谢您的澄清。还有另一种方法可以完全隐藏图层吗?似乎previewLayerUIViewController 的视图混淆了。我现在可以同时看到主视图的对象(例如UILabels, UIImages)和previewLayer。有什么办法可以解决这个问题?
    • 编辑我之前的评论*:是的,你实际上提到了self.view.layer.superlayer 。请你告诉我如何获得父超级层?谢谢你。非常感谢您的帮助!
    • 您可以将其不透明度设置为 0 或将其隐藏设置为 true,但我不知道这可能会对实际 AVCapture 产生什么影响。问题是为什么您想将图层添加到视图中但无法看到它。
    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多