Edited at

UIImagePickerControllerの処理を分割する!


UIImagePickerControllerの処理を分割する!

iOS開発において、ViewControllerの肥大化は大きな問題です。

同じ処理は、分割して、参照するような設計を意識したほうがいいです。

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


実装

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


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
}

}