Это потому, что вы пытаетесь включить фонарик (фонарик) за некоторое время до начала сеанса.Используя SceneKit, я попробовал этот подход и работал для меня нормально:
Сначала добавьте эту переменную в свой класс, чтобы знать, когда ваш фонарик (факел) включен или выключен:
var isTorchOn = false
Далее, внедрите метод ARSCNViewDelegate
didRenderScene
и, когда сессия будет готова, включите там фонарик.Поскольку этот делегат выполняется в каждом кадре, вам нужно использовать isTorchOn
для запуска метода фонарика только один раз.
Также обратите внимание, что я добавил флаг 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.