【Swift】カメラロールかフォトライブラリか、アラートで尋ねる

写真をその場で撮影するのか、カメラロールから選択するのかを尋ねるアラートを作成した。

目次

前提条件

  • Privacy – Photo Library Usage Description
  • Privacy – Camera Usage Description

この二つをinfo.plistに追加する。

完成図

コード全体

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
  
        
    }
    
    // MARK: カメラを起動
    @IBAction func cameraButton(){
       
        let alert: UIAlertController = UIAlertController(title: "プロフィールを設定", message: "どちらから設定しますか?", preferredStyle:  UIAlertController.Style.actionSheet)
        
        //カメラを起動するアラート
        let cameraAction: UIAlertAction = UIAlertAction(title: "カメラを起動", style: UIAlertAction.Style.default, handler:{
            (action: UIAlertAction!) -> Void in
            
            self.cameraAuth(vc: UserRegisterViewController(), completion: {_ in print("OK")})
            let picker = UIImagePickerController()
            picker.sourceType = .camera
            picker.delegate = self
            // UIImagePickerController カメラを起動する
            self.present(picker, animated: true, completion: nil)
            
            print("カメラを起動")
        })
        //フォトライブラリを起動するコード
        let photoAction: UIAlertAction = UIAlertAction(title: "フォトライブラリを起動", style: UIAlertAction.Style.default, handler:{
            (action: UIAlertAction!) -> Void in
            
            let picker = UIImagePickerController()
            self.present(picker, animated: true)
            
            //画像選択時のデリゲートを設定
            picker.delegate = self
            print("フォトライブラリを起動")
        })
        
        // Cancelボタン
        let cancelAction: UIAlertAction = UIAlertAction(title: "cancel", style: UIAlertAction.Style.cancel, handler:{
            (action: UIAlertAction!) -> Void in
            print("cancelAction")
        })
        
        // アクションを追加
        alert.addAction(cameraAction)
        alert.addAction(photoAction)
        
        // アラートを表示
        present(alert, animated: true, completion: nil)
        
        
    }
    
}

extension UserRegisterViewController {
    
    //カメラ呼び出し後の処理
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let image = info[.originalImage] as! UIImage
        //imageViewに画像を表示
        imageView.image = image
        // UIImagePickerController カメラが閉じる
        self.dismiss(animated: true, completion: nil)
    }
    
    
    //フォトライブラリ起動後の処理
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
        // 画像選択時の処理
        // ↓選んだ画像を取得
        let images = info[UIImagePickerController.InfoKey.originalImage.rawValue] as? UIImage
        
        //カメラロールを閉じる
        picker.dismiss(animated: true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        // キャンセルボタンを押下時の処理
        //カメラロールを閉じる
        picker.dismiss(animated: true, completion: nil)
    }
}

extension UserRegisterViewController {
    
    // カメラ許可コード
    func cameraAuth(
        vc: UIViewController,
        mediaType: AVMediaType = .video,
        title: String = "カメラを使用します",
        message: String = "カメラの使用が許可されていません。プライバシー設定でカメラの使用を許可してください",
        completion: @escaping (Bool) -> Void)
    {
        switch AVCaptureDevice.authorizationStatus(for: mediaType) {
        case .authorized:
            completion(true)
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: .video) { granted in
                completion(granted)
            }
        case .denied:
            // ユーザがカメラへのアクセスを拒否した
            dialogForConfiguration(vc: vc, title: title, message: message, completion: completion)
        case .restricted:
            // システムによってカメラへのアクセスが拒否された。
            // カメラが存在しない場合も多分ここ
            dialogForConfiguration(vc: vc, title: title, message: message, completion: completion)
        }
    }
    
    // カメラへのアクセスを許可するようユーザに促す
    private func dialogForConfiguration(
        vc: UIViewController,
        title: String,
        message: String?,
        completion: @escaping (Bool) -> Void)
    {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: .cancel) { _ in
            completion(false)
        }
        alertController.addAction(okAction)
        let settingsAction = UIAlertAction(title: "設定", style: .default) { _ in
            let url = URL(string: UIApplication.openSettingsURLString)
            UIApplication.shared.open(url!, options: [:]) { _ in
                completion(false)
            }
        }
        alertController.addAction(settingsAction)
        vc.present(alertController, animated: true, completion: nil)
    }
}


参考記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

東京のしがない文系大学生。中学の頃から趣味でプログラミングをやっている。iOS開発がメイン。最近は新しい言語の習得を目指し日々パソコンに向かっている。

目次