2017-01-05 6 views
1

Swift3 iOS10 приложение. Я положил SCNView в рамку раскадровки. Я положил UIView поверх этого (довести до фронта) и поместил его так, чтобы он заполнял только часть центра экрана.AVFoundation предварительный просмотр не отображается

В моем viewDidLoad Я использую AVFoundation, чтобы найти камеру, построить сеанс, добавить вход, сделать предварительный просмотр, а затем добавить этот предварительный просмотр в слои UIView.

И я получаю белый прямоугольник вместо просмотра:

enter image description here

я предполагаю, что я пропустил шаг где-то ...

// 3D scene and vars 
@IBOutlet var sceneView: SCNView! 
var camera: SCNNode! 
var sphere: SCNNode! 

// camera scene and vars 
@IBOutlet var cameraView: UIView! 
var cameraSession: AVCaptureSession = AVCaptureSession() 
var cameraDevice : AVCaptureDevice! 
var cameraInput : AVCaptureDeviceInput! 
var cameraLayer: AVCaptureVideoPreviewLayer! 

override func viewDidLoad() { 
    ... 3D setup here ... 

    cameraDevice = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back) 
    do { 
     let possibleCameraInput: AnyObject? = try AVCaptureDeviceInput(device: cameraDevice) 
     if let anInput = possibleCameraInput as? AVCaptureDeviceInput { 
      if cameraSession.canAddInput(anInput) { 
       cameraSession.addInput(anInput) 
      } 
     } 
    } catch _ { 
     //TODO handle this error 
    } 
    // add the preview layer to our imageview 
    if cameraSession.inputs.count > 0 { 
     cameraLayer = AVCaptureVideoPreviewLayer(session: cameraSession) as AVCaptureVideoPreviewLayer 
     cameraView.layer.addSublayer(cameraLayer) 
    } 
    cameraSession.startRunning() 
+0

Я никогда раньше не пробовал это из SCNView, но то, что вы делаете, выглядит нормально. Если ваш идентификатор проблемы предполагает, прежде всего, заполнять эти ошибки TODO. убедитесь, что вы попадаете в ваши операторы if и фактически получаете входные данные, убедитесь, что ваш вид и слой имеют размер (проверьте ограничения и т. д.), проверьте представление. ты не пробовал это на симуляторе? – Scriptable

+0

Ну, SCNView и UIView - это одноранговые узлы с «внешним видом», один Xcode вставляет автоматически. Да, это работает на моем телефоне ... добавление привязки. Кроме того, все ifs в порядке, и не возникает ошибок. –

ответ

0

OK ну это же оказаться просто некоторые недостающие шаги. Вы должны вручную установить masksToBounds, videoGravity и кадр или ничего не происходит (ошибка? Плохой API?) ...

 let viewLayer = cameraView.layer 
     viewLayer.masksToBounds = true 
     cameraView.backgroundColor = UIColor.clear 
     cameraLayer = AVCaptureVideoPreviewLayer(session: cameraSession) as AVCaptureVideoPreviewLayer 
     cameraLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     cameraLayer.frame = cameraView.frame 
     cameraView.layer.addSublayer(cameraLayer) 

И работает!