在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
接下来,实现
ARSCNViewDelegate
的didRenderScene
方法,并在会话准备就绪时,打开那里的手电筒。由于此委托是在每帧执行的,因此您只需要在其中使用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/