2017-09-30 7 views
4

iPad用Swift Playgroundアプリの最後のアップデートノートで、私はカメラが遊び場を通ってアクセスできることを知りました。 テスト目的のために、私は私のiPadのバックカメラにアクセスするための遊び場を作りました。Swift Playground iPadカメラへのアクセス

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() 

のためのプライベート変数を無視してください:ここでは

+1

ビューの 'bounds'をフレームとして' previewLayer'に割り当てる必要があります。私は現在 'previewLayer.frame'が' CGRect.zero'だと思います。 –

答えて

0

それは私がiOSの10.3と計算された上で、あなたのコードをチェックして、ビデオのプレビューが空だったiOSの11でのみ動作しますように見えます。同じコードが普通のアプリの中でうまく動いていた。 iOS 11を実行している別のタブレットでは、同じコードが魅力的なように機能していました。

関連する問題