DKImagePickerControllerをインストールしてコードに組み込んだのですが、シュミレータを使って実行したところphotolibraryが起動しないです。やりたいことは、NavigationAriaの『写真選択』ボタンを押し、カメラかフォトライブラリのどちらかを選択したのち、撮ったもしくは選んだ写真をdocumentsフォルダ下の"photo1"に保存するということです。swift5を用いており、Xcodeのバージョンは11.3.1です。
以下がコードです。よろしくお願いいたします。
swift
1import UIKit 2import DKImagePickerController 3import Photos 4 5class viewPhotoController1: UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate{ 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 // Do any additional setup after loading the view 11 //directory 作成 12 let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 13 let documetnsDirectory = paths[0] 14 let docURL = URL(string: documetnsDirectory)! 15 let datapath = docURL.appendingPathComponent("photo1") 16 if !FileManager.default.fileExists(atPath: datapath.absoluteString) { 17 do { 18 try FileManager.default.createDirectory(atPath: datapath.absoluteString, withIntermediateDirectories: true, attributes: nil) 19 } catch { 20 print(error.localizedDescription); 21 } 22 } 23 } 24 25 26 /* 27 // MARK: - Navigation 28 29 // In a storyboard-based application, you will often want to do a little preparation before navigation 30 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 31 // Get the new view controller using segue.destination. 32 // Pass the selected object to the new view controller. 33 } 34 */ 35 //画像保存 36 //画像を保存するメソッド jpegに直して保存 37 func saveImage (image: UIImage?, path: String ) -> Bool { 38 let jpgImageData = image?.jpegData(compressionQuality:0.5) 39 do { 40 try jpgImageData!.write(to: URL(fileURLWithPath: path), options: .atomic) 41 } catch { 42 print(error) 43 return false 44 } 45 return true 46 } 47 48 49 50 @IBAction func addPhoto1(_ sender: Any) { 51 //カメラかフォトライブラリどちらから画像を取得するか選択 52 let alertController = UIAlertController(title: "確認", message: "選択してください", preferredStyle: .actionSheet) 53 //まず、使用可能かを確認してからカメラ、フォトライブラリを起動するための選択肢を定義 54 if UIImagePickerController.isSourceTypeAvailable(.camera){ 55 let cameraAction = UIAlertAction(title: "カメラ", style: .default, handler: { 56 (action: UIAlertAction) in 57 //カメラを起動 58 let imagePickerController = UIImagePickerController() 59 imagePickerController.sourceType = .camera 60 imagePickerController.delegate = self 61 self.present(imagePickerController, animated: true, completion: nil) 62 63 }) 64 alertController.addAction(cameraAction) 65 } 66 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){ 67 let photoLibraryAction = UIAlertAction(title: "フォトライブラリー", style: .default, handler:{ 68 (action: UIAlertAction) in 69 //フォトライブラリを起動 70 let dkImagePickerController = DKImagePickerController() 71 //無制限に選択可能 72 dkImagePickerController.maxSelectableCount = 0 73 dkImagePickerController.sourceType = .photo 74 dkImagePickerController.showsCancelButton = true 75 dkImagePickerController.didSelectAssets = { [unowned self] (assets: [DKAsset]) in 76 //選択された画像はassetsに入れて返却されるのでfetch して取り出す。 77 for asset in assets { 78 asset.fetchFullScreenImage(completeBlock: {(image,info) in 79 let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 80 let documetnsDirectory = paths[0] 81 let docURL = URL(string: documetnsDirectory)! 82 let datapath = docURL.appendingPathComponent("photo1") 83 let datapathString = datapath.absoluteString 84 //ここで取り出せる,このimageはUIImage?型 85 self.saveImage(image: image, path: datapathString) 86 }) 87 } 88 } 89 }) 90 alertController.addAction(photoLibraryAction) 91 } 92 //キャンセルの選択肢を定義 93 let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil) 94 alertController.addAction(cancelAction) 95 //ipadで落ちてしまう対策 96 alertController.popoverPresentationController?.sourceView = view 97 //選択肢を画面に表示 98 present(alertController, animated: true, completion: nil) 99 100 } 101 102 //撮影が終わった時に呼ばれるdelegateメソッド 103 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 104 let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 105 let documetnsDirectory = paths[0] 106 let docURL = URL(string: documetnsDirectory)! 107 let datapath = docURL.appendingPathComponent("photo1") 108 let datapathString = datapath.absoluteString 109 110 let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage 111 //撮影した画像をdocumentsに保存する 112 if saveImage(image: image, path: datapathString){ 113 //モーダルビューを閉じる 114 dismiss(animated: true, completion: nil) 115 } 116 else { 117 //確認したのち結局モーダルビューを閉じる 118 let alertController = UIAlertController(title: "エラー", message: "画像を保存できませんでした", preferredStyle: .actionSheet) 119 let confirmAction = UIAlertAction(title: "確認", style: .cancel, handler: nil) 120 alertController.addAction(confirmAction) 121 dismiss(animated: true, completion: nil) 122 } 123 } 124 125}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/27 12:58