2017-09-30 2 views
4

Dans les dernières notes de mise à jour de l'application Swift Playground pour iPad, j'ai vu que les caméras seraient accessibles à travers les terrains de jeux. À des fins de test, j'ai donc créé une aire de jeux pour accéder à mon appareil photo arrière de l'iPad. Comme référence, je l'ai utilisé ces sources:Accès aux caméras iPad Swift Playground

Voici mon code:

import UIKit 
import AVFoundation 
import PlaygroundSupport 

class MainViewController : UIViewController { 
    private var _session: AVCaptureSession? 
    private var _captureInput: AVCaptureInput? 
    private var _stillImageOutput: AVCaptureStillImageOutput? 
    private var _frontCamera: AVCaptureDevice? 
    private var _previewView: UIView? 
    private var _previewLayer: AVCaptureVideoPreviewLayer? 

public override func loadView() { 
    print("loadView()") 

    _previewView = UIView() 
    guard let view = _previewView else { 
     printError(errMsg: "View could not be created!") 
     return 
    } 
    view.backgroundColor = UIColor.brown 
    self.view = view 
} 

public override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // Create a capture session 
    _session = AVCaptureSession() 
    guard let session = _session else { 
     printError(errMsg: "Session is empty!") 
     return 
    } 
    session.beginConfiguration() 
    session.sessionPreset = AVCaptureSession.Preset.photo 

    // Get access to front camera 
    _frontCamera = AVCaptureDevice.default(for: AVMediaType.video) 

    guard let frontCamera = _frontCamera 
     else { 
      printError(errMsg: "Front camera not accessible!") 
      return 
    } 

    do{ 
     _captureInput = try AVCaptureDeviceInput(device: frontCamera) 
    } catch let err as NSError { 
     printError(errMsg: err.localizedDescription) 
     return 
    } 

    // Add input to session 
    guard let captureInput = _captureInput else { 
     printError(errMsg: "Capture input not available!") 
     return 
    } 

    if session.canAddInput(captureInput){ 
     session.addInput(captureInput) 
    } 

    // Configurw the image output 
    _stillImageOutput = AVCaptureStillImageOutput() 
    guard let sillImageOutput = _stillImageOutput else { 
     printError(errMsg: "Image output not available!") 
     return 
    } 

    sillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 

    if session.canAddOutput(sillImageOutput) { 
     session.addOutput(sillImageOutput) 
    } 
    session.commitConfiguration() 
    // Add video preview layer 
    _previewLayer = AVCaptureVideoPreviewLayer(session: session) 

    guard let previewLayer = _previewLayer else { 
     printError(errMsg: "Preview layer not available!") 
     return 
    } 

    previewLayer.videoGravity = AVLayerVideoGravity.resizeAspect 
    previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 
    guard let view = _previewView else { 
     printError(errMsg: "View not available!") 
     return 
    } 
    view.layer.addSublayer(previewLayer) 
    view.layer.borderWidth = 5 

    // Start the capture session 
    session.startRunning() 
} 

public override func viewDidLoad() { 
    super.viewDidLoad() 
} 

public override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    guard let previewLayer = _previewLayer else { 
     printError(errMsg: "Preview layer not available!") 
     return 
    } 
    guard let previewView = _previewView else { 
     printError(errMsg: "View not available!") 
     return 
    } 
    print(previewView.bounds) 
    previewLayer.frame = previewView.bounds 
} 

private func printError(errMsg: String) { 
    print("[Error]: " + errMsg) 
} 
} 

PlaygroundPage.current.liveView = MainViewController() 

S'il vous plaît ignorer les variables privées pour la session, etc. Je sais que je peux/shoul d les rendre méthode locale.

La seule chose que je vois est le fond marron de la vue. enter image description here Lors de l'exécution de l'application pour la première fois iOS m'a demandé si l'application Playgrounds devrait avoir accès à la caméra que j'ai acceptée. Dans les paramètres, je peux également voir que l'application a accès à la caméra.

iOS Version: 10.3.3 App Playground: 1.6.1

+1

Vous devez affecter les 'bounds' de la vue en tant qu'image à' previewLayer'. Je pense que le 'previewLayer.frame' est actuellement' CGRect.zero'. –

Répondre

0

On dirait que ça ne fonctionne que sur iOS 11. J'ai vérifié votre code sur iPad avec iOS 10.3 et la prévisualisation vidéo était vide. Le même code fonctionnait très bien dans l'application normale. Sur une autre tablette exécutant iOS 11, le même code fonctionnait comme un charme.