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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

923閲覧

【Swift】DKImagePickerControllerの複数画像を取得する際に順番通りに取得ができない。

yamaji1108

総合スコア19

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2020/06/02 16:05

前提・実現したいこと

度々失礼いたします。
現在、DKImagePickerControllerを導入し4枚の画像を1枚に結合する(コラージュする)機能を作成中です。

コラージュ機能はopenCV(collageImageメソッド)で実装しており、
imageArray[0]に格納されている画像→左上
imageArray[1]に格納されている画像→右上
imageArray[2]に格納されている画像→左下
imageArray[3]に格納されている画像→右下
に配置されるように作っております。

![イメージ説明]

上のスクショのように、取り込む順番を考え4枚の画像を選択して実行したところ

イメージ説明

意図した配置となりませんでした。
結果として、
imageArray[0]に4番目に選択した画像
imageArray[1]に1番目に選択した画像
imageArray[2]に3番目に選択した画像
imageArray[3]に2番目に選択した画像
が格納されてしまったということです。

おそらく

self.imageArray.append(image!)

あたりの書き方が問題だと思うのですが、修正すべきか分かりません。

どのようにすれば、選択した順番通りに配列に画像を格納できるでしょうか。

どうかご教授のほど、よろしくお願いします。

該当のソースコード

swift

1// 2// ViewController.swift 3// 4 5import UIKit 6import CropViewController 7import AVFoundation 8import DKImagePickerController 9 10class ViewController: UIViewController, UINavigationControllerDelegate { 11 12 let kGradientLayerName = "Gradient" 13 14 var viewModel: ViewModel = ViewModel() 15 //フラグ 0:加工 1:コラージュ 16 var retouchFlug: Int = 0 17 18 //base 19 @IBOutlet weak var imageSizeLabel: UILabel! 20 @IBOutlet weak var baseView: UIView! 21 @IBOutlet weak var sourceImageView: UIImageView! 22 @IBOutlet weak var sampleImageView: UIImageView! 23 @IBOutlet weak var cropImageView: UIImageView! 24 @IBOutlet weak var retouchSegment: UISegmentedControl! 25 26 //collage 27 var imageArray:[UIImage] = [] 28 29 override func viewDidLoad() { 30 super.viewDidLoad() 31 //略 32 } 33 34///1. 画像取得 35extension ViewController { 36 37 //コラージュボタンを押下したときの処理 38 @IBAction func collageButtonDidtap(sender: AnyObject) { 39 //フラグを1に 40 self.retouchFlug = 1 41 self.pickImages() 42 // imageArrayの要素が4になるまで待ちます 43 wait( { self.imageArray.count < 4 } ) { 44 // 取得しました 45 print("finish") 46 DispatchQueue.global(qos: .default).async { 47 let resultImg = OpenCVManager.shared()?.collageImage(self.imageArray[0], image2: self.imageArray[1], image3: self.imageArray[2], image4: self.imageArray[3]) 48 DispatchQueue.main.async { 49 self.doneRetouch(image: resultImg) 50 } 51 } 52 } 53 } 54 55 // 写真を選択する 56 func pickImages() { 57 let picker = DKImagePickerController() 58 //選択できる写真の最大数を指定 59 picker.maxSelectableCount = 4 60 //カメラモード、写真モードの選択 61 picker.sourceType = .photo 62 //キャンセルボタンの有効化 63 picker.showsCancelButton = true 64 //UIのカスタマイズ 65 picker.UIDelegate = CustomUIDelegate() 66 picker.didSelectAssets = { (assets: [DKAsset]) in 67 for asset in assets { 68 asset.fetchFullScreenImage(completeBlock: { (image, info) in 69 self.imageArray.append(image!) 70 }) 71 } 72 } 73 // 74 self.present(picker, animated: true, completion: nil) 75 } 76 77 /// 条件をクリアするまで待つ関数 78 /// 79 /// - Parameters: 80 /// - waitContinuation: 待機条件 81 /// - compleation: 通過後の処理 82 private func wait(_ waitContinuation: @escaping (()->Bool), compleation: @escaping (()->Void)) { 83 var wait = waitContinuation() 84 // 0.01秒周期で待機条件をクリアするまで待ちます。 85 let semaphore = DispatchSemaphore(value: 0) 86 DispatchQueue.global().async { 87 while wait { 88 DispatchQueue.main.async { 89 wait = waitContinuation() 90 semaphore.signal() 91 } 92 semaphore.wait() 93 Thread.sleep(forTimeInterval: 0.01) 94 } 95 // 待機条件をクリアしたので通過後の処理を行います。 96 DispatchQueue.main.async { 97 compleation() 98 } 99 } 100 } 101 102} 103//略 104} 105

補足情報(FW/ツールのバージョンなど)

Xcode Version 11.4.1
Swift Version 5.0.1
iOS 12.4.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

上記の議論にあるように、取得してくるデータはどこに(端末上なのかiCloud上なのかなど)あるかわからないため、非同期処理となっている上その順番は保証されていないようです。

また、現時点では選択順にダウンロードするオプションも提供されていないようです。

投稿2020/06/03 00:26

TsukubaDepot

総合スコア5086

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

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

yamaji1108

2020/06/03 00:33

TsukubaDepot様 前回に引き続き、ご回答いただきありがとうございます! 順番は保証されないのですね。配置を入れ替える機能を実装しようと思います。 今後、GitHubのissuesにも目を通すように心がけます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問