写真をその場で撮影するのか、カメラロールから選択するのかを尋ねるアラートを作成した。
目次
前提条件
- 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)
}
}