Xcode
Swift

CameraViewの上からスクリーンショットを撮ると真っ白になった

実行環境

・Swift4
・Xcode9
・iPhone SE(ios10.3)

経緯

音の出ないカメラアプリを作りたい!と思い、方法を自分なりに考えた結果
「CameraViewの上からスクリーンショットを撮れば音がならないんじゃないか!」
と考える

実践

とりあえずカメラの設定をゴニョゴニョやって映像を映し出す

CameraViewController
import UIKit
import AVFoundation

class CameraViewController: UIViewController, AVCapturePhotoCaptureDelegate {

    @IBOutlet weak var cameraView: UIView!
    var captureSesssion: AVCaptureSession!
    var stillImageOutput: AVCapturePhotoOutput?
    var previewLayer: AVCaptureVideoPreviewLayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        captureSesssion = AVCaptureSession()
        stillImageOutput = AVCapturePhotoOutput()

        // 解像度の設定
        captureSesssion.sessionPreset = AVCaptureSession.Preset.hd1920x1080

        let device = AVCaptureDevice.default(for: .video)

        do {
            let input = try AVCaptureDeviceInput(device: device!)

            // 入力
            if (captureSesssion.canAddInput(input)) {
                captureSesssion.addInput(input)

                // 出力
                if (captureSesssion.canAddOutput(stillImageOutput!)) {

                    // カメラ起動
                    captureSesssion.addOutput(stillImageOutput!)
                    captureSesssion.startRunning()

                    // アスペクト比、カメラの向き()
                    previewLayer = AVCaptureVideoPreviewLayer(session: captureSesssion)
                    previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
                    previewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait

                    cameraView.layer.addSublayer(previewLayer!)

                     //ビューのサイズの調整
                    previewLayer?.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2)
                    previewLayer?.bounds = cameraView.frame
                }
            }
        }
        catch {
            print(error)
        }
    }
}

これで映像をViewに流せたので、あとは画面のスクリーンショットを撮るだけ!

CameraViewController
        // キャプチャしたい枠を決める
        let rect = view.bounds

        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)

        view.drawHierarchy(in: rect, afterScreenUpdates: true)

        let cont = UIGraphicsGetCurrentContext()
        view.layer.render(in: cont!)

        // キャプチャした画像を変数に保持
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)

これであとはテストするだけ!

実機でテストしてみた

qiita.png

ってあれええええええぇぇえ!!!!!!!!
なんと撮れた写真を確かめて見ると真っ白ではありませんか!?!?

解説

どうやらカメラの映像を表示しているViewが画面内にあると、そのViewが真っ白になるようです。

試しにViewの上にButtonを配置してスクリーンショットを撮ってみると、Viewが真っ白になりますがButtonはしっかり映っています
試しに置いてみた.png

まとめ

CameraViewの上からスクリーンショットを撮ると真っ白になる

最後に

当初の目的であった「音を出さずに写真を撮る」は他の方法で試してみたいと思います。