0

I have a view with a SceneKit in the background and an AVCaptureVideoPreviewLayer in the foreground. I want a semi-transparent version of the background to be visible over the camera. So based on an older thread here, I added a UIImageView and put this in an action:

    let background = sceneView.snapshot()
    let cameraview = background.cgImage!.cropping(to: overlayView.bounds)
    overlayView.image = UIImage.init(cgImage: cameraview!, scale: 1, orientation: .upMirrored)

This works. The problem is that I have to track the motion of the phone so that the grid aligns with the real world. So...

func trackMotion(motion: CMDeviceMotion?, error: Error?) {
    guard let motion = motion else { return }
    guard (self.camera) != nil else { return }
    self.camera.orientation = motion.gaze(atOrientation: UIApplication.shared.statusBarOrientation)

    let background = sceneView.snapshot()
    let cameraview = background.cgImage!.cropping(to: overlayView.bounds)
    overlayView.image = UIImage.init(cgImage: cameraview!, scale: 1, orientation: .upMirrored)
}

EXE_BAD_ACCESS on the sceneView.snapshot. I note again, it works perfectly if I just put the exact same code in an action. I suspect this is some sort of timing issue, because if I put a breakpoint there it does not crash, but instead, the SceneKit is all-black even after I continue.

Any advice?

Maury Markowitz
  • 9,082
  • 11
  • 46
  • 98

0 Answers0