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

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

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

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

Swift

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

Q&A

0回答

1519閲覧

画像をUICollectionViewCellで並べて表示させたい

shisen-t

総合スコア21

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/05/17 09:17

現在アプリ内で撮影した写真や動画のサムネイルを確認するためにUIImageViewを用いています。さらに、もともとカメラロールに入っていた画像も表示できるようにしようとDKImagePickerControllerを用いるようにしたのですが、UIImageViewのままでは一枚しか表示されないためUICollectionViewを用いて複数枚表示できるようにしたいと考えています。
こちらやUICollectionViewの使い方を載せたサイトを参考にカメラロールの画像だけでなくアプリ内で撮影したものも表示できるよう挑戦してみました。しかし、CollectionViewCellに関連づけたUIImageViewに画像を表示させる方法がわからず、進めずにいる状況です。

参考にするべき資料等ご存知の方がいらっしゃいましたら、教えていただけますと幸いです。

Swift

1import UIKit 2import AVKit 3import AVFoundation 4import Photos 5import DKImagePickerController 6 7class UploadViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 8 let imagePickerController = DKImagePickerController() 9 10 var videoURL: URL? 11 var myImage: UIImage! 12 13 14 @IBOutlet weak var imageView: UIImageView! 15 16 17 @IBOutlet weak var selectButton: UIButton! 18 19 @IBOutlet weak var playButtton: UIButton! 20 21 22 @IBAction func selectImage(_ sender: Any) { 23 let controller: UIAlertController = UIAlertController(title: "", message: "どの方法で写真を読み込みますか?", preferredStyle: UIAlertController.Style.actionSheet) 24 25 //1つ目の選択肢 26 controller.addAction(UIAlertAction(title: "写真を撮影する", style: UIAlertAction.Style.default, handler: {(action)in self.selectedCamera()})) 27 28 //2つ目の選択肢 29 controller.addAction(UIAlertAction(title: "カメラロールから読み込む", style: UIAlertAction.Style.default, handler: { (action)in self.selectedLibrary()})) 30 31 32 //キャンセルボタン 33 controller.addAction(UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: nil)) 34 35 //UIAleartControllerを表示 36 self.present(controller, animated: true, completion: nil ) 37 38 39 } 40 41 42 43 44 override func viewDidLoad() { 45 super.viewDidLoad() 46 } 47 48 49 override func didReceiveMemoryWarning() { 50 super.didReceiveMemoryWarning() 51 52 } 53 54 55 56 57 58 //カメラを起動 59 func selectedCamera() { 60 //カメラが使用できるかチェック 61 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera){ 62 print("カメラは利用できます") 63 64 //UIimagePickerViewControllerのインスタンスを生成 65 let picker: UIImagePickerController = UIImagePickerController() 66 67 //カメラを起動する 68 picker.sourceType = UIImagePickerController.SourceType.camera 69 70 //UIImagePickerControllerDelegateを自身に設定 71 picker.delegate = self 72 73 //カメラで撮れる種類の設定 74 picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .camera) ?? [] 75 76 //カメラ画面を表示 77 self.present(picker, animated: true, completion: nil) 78 }else{ 79 //カメラを起動できない時 80 print("カメラは利用できません") 81 } 82 } 83 84 85 86 87 //カメラロールから画像を選択 88 func selectedLibrary() { 89 //写真や動画が読み込めるかチェック 90 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) { 91 92 93 let pickerController = DKImagePickerController() 94 // 選択可能な枚数を20にする 95 pickerController.maxSelectableCount = 20 96 pickerController.didSelectAssets = { [unowned self] (assets: [DKAsset]) in 97 98 // 選択された画像はassetsに入れて返却されるのでfetchして取り出す 99 for asset in assets { 100 asset.fetchFullScreenImage(completeBlock: { (image, info) in 101 // どのように書き換えたらよいのかわからない場所 102 self.imageView.image = image 103 }) 104 105 } 106 107 108 } 109 110 self.present(pickerController, animated: true) {} 111 112 113 } 114 115} 116 117 118 119 120 //撮影が終わった後の処理 121 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:[UIImagePickerController.InfoKey: Any]) { 122 123 //撮影・選択した画像が正しく取得できたかをチェック 124 if let editedImage = info[.originalImage] as? UIImage { 125 126       // どのように書き換えたらよいかわからない場所 127 //UIImageViewに画像をセット 128 imageView.image = editedImage 129 //オリジナルデータをセット 130 myImage = editedImage 131 132 } 133 134 135 136 //撮影・選択した動画が正しく取得できているかチェック 137 if let videoURL = info[.mediaURL] as? URL { 138 139 //UIImageViewに動画のサムネイル画像をセット 140 print(videoURL) 141 // どのように書き換えたらよいかわからない場所 142 imageView.image = previewImageFromVideo(videoURL)! 143 144 145 146 // 撮影した動画の保存 147 UISaveVideoAtPathToSavedPhotosAlbum(videoURL.path, self, #selector(self.showResultSavedImage (_:didFinishSavingWithError:contextInfo:)), nil) 148 149 } 150 151 152 153 //UIPickerControllerを閉じる 154 picker.dismiss(animated: true, completion: nil) 155 } 156 157 158 //サムネイルの生成 159 func previewImageFromVideo(_ url:URL) -> UIImage? { 160 161 print("動画からサムネイルを生成する") 162 let asset = AVAsset(url:url) 163 let imageGenerator = AVAssetImageGenerator(asset:asset) 164 imageGenerator.appliesPreferredTrackTransform = true 165 var time = asset.duration 166 time.value = min(time.value,2) 167 do { 168 let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil) 169 return UIImage(cgImage: imageRef) 170 } catch { 171 return nil 172 } 173 } 174 175 176 177 @objc func showResultSavedImage(_ image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) { 178 179 //表示するメッセージ用の変数を用意 180 var title:String = "保存完了" 181 var message:String = "カメラロールに保存しました" 182 183 //保存が行えなかった場合はエラーメッセージを表示 184 if error != nil { 185 title = "エラー" 186 message = "保存に失敗しました。設定でプライバシー設定を確認してください" 187 } 188 189 let controller: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 190 191 controller .addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel, handler: nil)) 192 self.present(controller, animated: true, completion: nil) 193 } 194 195} 196

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問