初心者です。
今、Xcodeでカメラのアプリを作ろうとしてます。
カメラは現在多くの人が使っている通信アプリなどで使われているように、写真をとると、撮った写真の確認画面に”撮り直し”または”この写真を使う”などのボタンがついた新しいViewControllerが出て来て、最終的にPOSTを使ってどこかへ発送できるようにしたいです。
現在の段階ではカメラの用意はできています。ただ、写真をとっただけで終わりになり、撮った写真の確認画面さえないです。
そこで、写真を撮ったら自動的に新しいViewControllerに画面遷移し、そこで自分が撮った写真の確認ができるようにしたいです。
それができるためにはどんな関数を使い、どこに挿入すればいいでしょうか。できれば参考でくるサイトをご掲示してくだされば嬉しいです。
お願いします。
カメラのViewControllerのコードは以下になります。
swift
1import UIKit 2import AVFoundation 3 4class SecondViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 5 // デバイスからの入力と出力を管理するオブジェクトの作成 6 var captureSession = AVCaptureSession() 7 // カメラデバイスそのものを管理するオブジェクトの作成 8 // メインカメラの管理オブジェクトの作成 9 var mainCamera: AVCaptureDevice? 10 // インカメの管理オブジェクトの作成 11 var innerCamera: AVCaptureDevice? 12 // 現在使用しているカメラデバイスの管理オブジェクトの作成 13 var currentDevice: AVCaptureDevice? 14 // キャプチャーの出力データを受け付けるオブジェクト 15 var photoOutput : AVCapturePhotoOutput? 16 // プレビュー表示用のレイヤ 17 var cameraPreviewLayer : AVCaptureVideoPreviewLayer? 18 19 // シャッターボタン 20 @IBOutlet weak var cameraButton: UIButton! 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 setupCaptureSession() 25 setupDevice() 26 setupInputOutput() 27 setupPreviewLayer() 28 captureSession.startRunning() 29 styleCaptureButton() 30 // Do any additional setup after loading the view, typically from a nib. 31 } 32 33 override func didReceiveMemoryWarning() { 34 super.didReceiveMemoryWarning() 35 // Dispose of any resources that can be recreated. 36 } 37 38 /// 撮影ボタン押下時に呼ばれる 39 @IBAction func cameraButton_TouchUpInside(_ sender: Any) { 40 41 let settings = AVCapturePhotoSettings() 42 // フラッシュの設定 43 settings.flashMode = .auto 44 // カメラの手ぶれ補正 45 settings.isAutoStillImageStabilizationEnabled = true 46 // 撮影された画像をdelegateメソッドで処理 47 self.photoOutput?.capturePhoto(with: settings, delegate: self as! AVCapturePhotoCaptureDelegate) 48 } 49} 50 51//MARK: AVCapturePhotoCaptureDelegateデリゲートメソッド 52extension SecondViewController: AVCapturePhotoCaptureDelegate{ 53 // 撮影した画像データが生成されたときに呼び出されるデリゲートメソッド 54 func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { 55 if let imageData = photo.fileDataRepresentation() { 56 // Data型をUIImageオブジェクトに変換 57 let uiImage = UIImage(data: imageData) 58 // 写真ライブラリに画像を保存 59 UIImageWriteToSavedPhotosAlbum(uiImage!, nil,nil,nil) 60 } 61 } 62} 63 64//MARK: カメラ設定メソッド 65extension SecondViewController{ 66 // カメラの画質の設定 67 func setupCaptureSession() { 68 captureSession.sessionPreset = AVCaptureSession.Preset.photo 69 } 70 71 // デバイスの設定 72 func setupDevice() { 73 // カメラデバイスのプロパティ設定 74 let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified) 75 // プロパティの条件を満たしたカメラデバイスの取得 76 let devices = deviceDiscoverySession.devices 77 78 for device in devices { 79 if device.position == AVCaptureDevice.Position.back { 80 mainCamera = device 81 } else if device.position == AVCaptureDevice.Position.front { 82 innerCamera = device 83 } 84 } 85 // 起動時のカメラを設定 86 currentDevice = mainCamera 87 } 88 89 // 入出力データの設定 90 func setupInputOutput() { 91 do { 92 // 指定したデバイスを使用するために入力を初期化 93 let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!) 94 // 指定した入力をセッションに追加 95 captureSession.addInput(captureDeviceInput) 96 // 出力データを受け取るオブジェクトの作成 97 photoOutput = AVCapturePhotoOutput() 98 // 出力ファイルのフォーマットを指定 99 photoOutput!.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecType.jpeg])], completionHandler: nil) 100 captureSession.addOutput(photoOutput!) 101 } catch { 102 print(error) 103 } 104 } 105 106 // カメラのプレビューを表示するレイヤの設定 107 func setupPreviewLayer() { 108 // 指定したAVCaptureSessionでプレビューレイヤを初期化 109 self.cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 110 // プレビューレイヤが、カメラのキャプチャーを縦横比を維持した状態で、表示するように設定 111 self.cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 112 // プレビューレイヤの表示の向きを設定 113 self.cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 114 115 self.cameraPreviewLayer?.frame = view.frame 116 117 self.view.layer.insertSublayer(self.cameraPreviewLayer!, at: 0) 118 } 119 // ボタンのスタイルを設定 120 func styleCaptureButton() { 121 cameraButton.layer.borderColor = UIColor.white.cgColor 122 cameraButton.layer.borderWidth = 5 123 124 cameraButton.clipsToBounds = true 125 cameraButton.layer.cornerRadius = min(cameraButton.frame.width, cameraButton.frame.height) / 2 126 } 127} 128
ちなみにカメラのコードは以下のサイトを参考にしました。
リンク内容
回答1件
あなたの回答
tips
プレビュー