質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1122閲覧

Swiftで写真を複数選択するために外部ライブラリのDKImagePickerControllerを用いているのですがPhotoLibraryが起動しない。

PINE1103

総合スコア20

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/03/27 09:40

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

swift

1self.present(dkImagePickerController, animated: true, completion: nil)

上の行が抜けているので、DKImagePickerが表示されていないんだと思います。

投稿2020/03/27 10:45

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PINE1103

2020/03/27 12:58

ありがとうございます!うまくいきました!
guest

0

info.plistを編集して写真へのアクセスの許可を求める必要があったように思いますが、設定しましたか?

投稿2020/03/27 10:00

RyotaroIsoyama

総合スコア183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PINE1103

2020/03/27 12:59

設定いたしました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問