LoginSignup
2

More than 3 years have passed since last update.

UIImagePickerControllerDelegateの処理を分割する!

Last updated at Posted at 2019-09-30

UIImagePickerControllerDelegateの処理を分割する!

iOS開発において、ViewControllerの肥大化は大きな問題です。
同じ処理は、分割して、参照するような設計を意識したほうがいいです。

今回は、処理が長くなりやすい** UIImagePickerControllerDelegate**を取り扱ったサンプルを紹介します。

実装

今回は、コードについての説明は省かせて頂きます。

ViewController.swift
import UIKit

class ViewController: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate{


    @IBOutlet weak var sampleImage: UIImageView!


    override func viewDidLoad() {
        super.viewDidLoad()
        sampleImage.isUserInteractionEnabled = true
    }

    @IBAction func imageTapped(_ sender: Any) {

        let camera = Camera(delegate_: self)

        let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)

        let takePhotoOrVideo = UIAlertAction(title: "カメラ", style: .default) { (action) in
            camera.PresentMultyCamera(target: self, canEdit: false)
        }

        let sharePhoto = UIAlertAction(title: "ライブラリ", style: .default) { (action) in

            camera.PresentPhotoLibrary(target: self, canEdit: false)
        }

        let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel) { (action) in
        }

        optionMenu.addAction(takePhotoOrVideo)
        optionMenu.addAction(sharePhoto)
        optionMenu.addAction(cancelAction)
        self.present(optionMenu, animated: true, completion: nil)
    }


    //MARK: UIImagePicker Delegate
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        let picture = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
        let video = info[UIImagePickerController.InfoKey.mediaURL] as? NSURL

        sampleImage.image = picture


        picker.dismiss(animated: true, completion: nil)
    }

}
Camera.swift

import Foundation
import UIKit
import MobileCoreServices

class Camera {

    var delegate: UIImagePickerControllerDelegate & UINavigationControllerDelegate

    init(delegate_: UIImagePickerControllerDelegate & UINavigationControllerDelegate) {

        delegate = delegate_
    }


    func PresentPhotoLibrary(target: UIViewController, canEdit: Bool) {

        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) && !UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.savedPhotosAlbum) {
            return
        }

        let type = kUTTypeImage as String
        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {

            imagePicker.sourceType = .photoLibrary

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary) {

                if (availableTypes as NSArray).contains(type) {
                    imagePicker.mediaTypes = [type]
                    imagePicker.allowsEditing = canEdit
                }
            }
        } else if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
            imagePicker.sourceType = .savedPhotosAlbum

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum) {

                if (availableTypes as NSArray).contains(type) {
                    imagePicker.mediaTypes = [type]
                }
            }
        } else {
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.delegate = delegate

        target.present(imagePicker, animated: true, completion: nil)

        return
    }

    func PresentMultyCamera(target: UIViewController,  canEdit: Bool) {

        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
            return
        }

        let type1 = kUTTypeImage as String
        let type2 = kUTTypeMovie as String

        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.camera) {

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {

                if (availableTypes as NSArray).contains(type1) {

                    imagePicker.mediaTypes = [type1, type2]
                    imagePicker.sourceType = UIImagePickerController.SourceType.camera
                }
            }
            if UIImagePickerController.isCameraDeviceAvailable(.rear) {
                imagePicker.cameraDevice = UIImagePickerController.CameraDevice.rear
            }
            else if UIImagePickerController.isCameraDeviceAvailable(.front) {
                imagePicker.cameraDevice = UIImagePickerController.CameraDevice.front
            }
        } else {
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.showsCameraControls = true
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil)
    }

    func PresentPhotoCamera(target: UIViewController,  canEdit: Bool) {

        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
            return
        }

        let type1 = kUTTypeImage as String

        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.camera) {

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {

                if (availableTypes as NSArray).contains(type1) {

                    imagePicker.mediaTypes = [type1]
                    imagePicker.sourceType = UIImagePickerController.SourceType.camera
                }
            }
            if UIImagePickerController.isCameraDeviceAvailable(.rear) {
                imagePicker.cameraDevice = UIImagePickerController.CameraDevice.rear
            }
            else if UIImagePickerController.isCameraDeviceAvailable(.front) {
                imagePicker.cameraDevice = UIImagePickerController.CameraDevice.front
            }
        } else {
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.showsCameraControls = true
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil)
    }


    // Video Camera
    func PresentVideoCamera(target: UIViewController,  canEdit: Bool) {

        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
            return
        }

        let type1 = kUTTypeMovie as String

        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.camera) {

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {

                if (availableTypes as NSArray).contains(type1) {

                    imagePicker.mediaTypes = [type1]
                    imagePicker.sourceType = UIImagePickerController.SourceType.camera
                    imagePicker.videoMaximumDuration = 120.0
                }
            }
            if UIImagePickerController.isCameraDeviceAvailable(.rear) {
                imagePicker.cameraDevice = UIImagePickerController.CameraDevice.rear
            }
            else if UIImagePickerController.isCameraDeviceAvailable(.front) {
                imagePicker.cameraDevice = UIImagePickerController.CameraDevice.front
            }
        } else {
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.showsCameraControls = true
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil)
    }

    func PresentVideoLibrary(target: UIViewController, canEdit: Bool) {
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) && !UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.savedPhotosAlbum) {
            return
        }

        let type = kUTTypeMovie as String
        let imagePicker = UIImagePickerController()

        imagePicker.videoMaximumDuration = 120.0

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {

            imagePicker.sourceType = .photoLibrary

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary) {

                if (availableTypes as NSArray).contains(type) {

                    imagePicker.mediaTypes = [type]
                    imagePicker.allowsEditing = canEdit

                }
            }
        } else if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
            imagePicker.sourceType = .savedPhotosAlbum

            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum) {

                if (availableTypes as NSArray).contains(type) {
                    imagePicker.mediaTypes = [type]
                }
            }
        } else {
            return
        }

        imagePicker.allowsEditing = canEdit
        imagePicker.delegate = delegate
        target.present(imagePicker, animated: true, completion: nil) 

        return
    }

}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2