在ARSession中如何打开手电筒(手电筒)?

一旦关闭手电筒开始会话,标准代码将不起作用。

初始化ARSession:

        let configuration = ARWorldTrackingConfiguration()
        self.sceneView.session.run(configuration, options: [.removeExistingAnchors])


打开/关闭手电筒的功能:

private func turnTorch(enabled: Bool) {
    guard let device = AVCaptureDevice.default(for: AVMediaType.video) else {
        return // Cant initiate avcapturedevice error
    }

    if device.hasTorch {
        do {
            try device.lockForConfiguration()

            if enabled {
                device.torchMode = .on
            } else {
                device.torchMode = .off
            }

            device.unlockForConfiguration()
        } catch {
            return //Torch could not be used, lock for configuration failed
        }

    } else {
        return // Torch not available error
    }
}

最佳答案

这是因为您要在会话运行前一段时间打开手电筒(电筒)。
使用SceneKit,我尝试了这种方法,并为我工作得很好:

首先,将此变量添加到您的类中以了解何时打开或关闭手电筒:

var isTorchOn = false


接下来,实现ARSCNViewDelegatedidRenderScene方法,并在会话准备就绪时,打开那里的手电筒。由于此委托是在每帧执行的,因此您只需要在其中使用isTorchOn即可运行一次flashlight方法。

另外,请注意,我已经在isTorchOn方法内添加了turnTorch标志以更新其值。

最终的简化代码:

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    var isTorchOn = false

    private func turnTorch(enabled: Bool) {
        guard let device = AVCaptureDevice.default(for: AVMediaType.video) else {
            return // Cant initiate avcapturedevice error
        }

        if device.hasTorch {
            do {
                try device.lockForConfiguration()

                if enabled {
                    device.torchMode = .on
                } else {
                    device.torchMode = .off
                }
                self.isTorchOn = enabled // *** Add this line! ***

                device.unlockForConfiguration()
            } catch {
                return
            }

        } else {
            return
        }
    }

    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
        if self.sceneView.session.currentFrame != nil {
            if !isTorchOn {
                turnTorch(enabled: true)
            }
        }
    }

    func sessionWasInterrupted(_ session: ARSession) {
        // Probably you would want to turn the torch off here.
    }

    func sessionInterruptionEnded(_ session: ARSession) {
        // Probably you would want to turn the torch on again here.
    }

}


如果使用SpriteKit,则可以遵循相同的方法。

关于ios - 在ARSession期间打开手电筒,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53675631/

10-12 05:58