Swift

写真を選択orカメラの起動

完成形

Viewの設置

MainViewにImageViewとUIButtonを設置し、コードに接続します。

UIButtonがタップされたことをViewControllerに伝えておきます。

写真とカメラへのアクセス許可

写真アプリとカメラアプリにアクセスするには、ユーザーに予め許可をとる必要があります。
(許可を取っていない場合、エラーが出るようになっています。)

Info.plist に以下2つを追加します。

  • Privacy – Photo Library Usage Description : ライブラリへのアクセスを許可しますか?
  • Privacy – Camera Usage Description  : カメラへのアクセスを許可しますか?

 

写真orカメラの起動

ViewControllerに以下の関数を追加します。

func useCamera(isDeletable: Bool?=nil,
                          deleteAction:((UIAlertAction) -> Void)?=nil) {
        checkCameraAuth {
            DispatchQueue.main.async { [weak self] in
                guard let this = self else { return }
                this.activeCamera(isDeletable: isDeletable,
                                      deleteAction: deleteAction)
            }
        }
}
func activeCamera(isDeletable: Bool?=nil,
                             deleteAction:((UIAlertAction) -> Void)?=nil) {
    let alert: UIAlertController = UIAlertController(title: "", message: "選択してください", preferredStyle: .actionSheet)
    let cameraAction: UIAlertAction = UIAlertAction(title: "カメラで撮影", style: .default, handler:{ [weak self]
            (action: UIAlertAction!) -> Void in
        guard let this = self else { return }
        let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.camera
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera){
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = this
            this.present(cameraPicker, animated: true, completion: nil)
        }
    })

    let galleryAction: UIAlertAction = UIAlertAction(title: "アルバムから選択", style: .default, handler:{ [weak self]
        (action: UIAlertAction!) -> Void in
        guard let this = self else { return }
        let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.photoLibrary
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
            let libraryPicker = UIImagePickerController()
            libraryPicker.sourceType = sourceType
            libraryPicker.delegate = this
            this.present(libraryPicker, animated: true, completion: nil)
        }
    })

    let deleteAction = UIAlertAction(title: "写真を削除", style: .default, handler: deleteAction)
    let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler:{
        (action: UIAlertAction!) -> Void in
        print("キャンセル")
    })
    alert.addAction(cancelAction)
    alert.addAction(cameraAction)
    alert.addAction(galleryAction)
    if isDeletable == true {
        alert.addAction(deleteAction)
    }
    present(alert, animated: true, completion: nil)
}

 

写真を変更ボタンが押されたときにこのuseCamera関数を呼び出すと、

写真またはカメラを選択するアクションシートが出て来ます。

(1番最初は、ライブラリとカメラへのアクセス許可を求めるアラートが表示されます。)

※カメラはシュミレーターでは起動しません。

選択された写真の表示

アルバムまたはカメラから写真が選択されたら、その写真をImageViewに表示させます。

以下の関数を追加します。

3行目で、mainViewに置いたImageViewに選択されたimageを入れています。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let image = info[.originalImage] as? UIImage {
        self.mainView.mainImageView.image = image
        picker.dismiss(animated: true, completion: nil)
    }
}

 

 

ABOUT ME
伊原 萌夏
スクール担当 兼 iOS(時々Web)エンジニア。 2019年7月に大学を一年半で辞め、大学とは別で勉強していたプログラムの世界で生きていくことを決意。翌月8月に入社。 主にSwiftのスクールを担当。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA