hoshi-takanoriさんのコメントの通り、カスタムクラスにする必要はなく、UIKit の UIImagePicker と同じような感じで使えば大丈夫です。
おそらく、DKImagePikcer で検索したときに最初に引っかかるQiita記事が「カスタムクラスとして実装した」記事で、それと同じ方法で実装されているので誤解されたのかと思います。
ざっと流れを書くと、
Swift
1 @objc func selectImages(_ sender: UIButton) {
2 let imagePicker = DKImagePickerController()
3 //選択できる写真の最大数を指定
4 imagePicker.maxSelectableCount = 3
5
6 // 中略
7
8 // ここでDKImagePickerを表示
9 present(imagePicker, animated: true, completion: nil)
10 }
11
みたいな感じで、任意のメソッド(@IBAction
で関連付けたメソッドを含む)内部でこのように記述すれば大丈夫です。
実は、DKImagePicker での画像取り込みは「非同期である」ことの方が落とし穴で引っかかりやすいので、先回りしてそこについても触れておきます。
imagePicker.didSelectAssets
で Asset
として取得されるデータから UIImage
を作る流れになっているのですが、この過程で iCloud
などにアクセスするため、内部で処理する append
などの処理も完全に非同期、かつ順番が保証されていません。
なので、複数枚数選択した場合には、選択枚数やダウンロード状況に応じてダウンロード完了後の処理を行うように記述する必要があります。
いろいろ方法はあるのですが、愚直にかけばこんな感じになると思います。
Swift
1import UIKit
2import DKImagePickerController
3
4class ViewController: UIViewController {
5 let tableView = UITableView()
6 let button = UIButton(type: .system)
7
8 var photos: [UIImage] = []
9 // 実際に選択された枚数
10 var selectedCount = 0
11
12 override func viewDidLoad() {
13 print(#function)
14 super.viewDidLoad()
15 // Do any additional setup after loading the view.
16 view.addSubview(tableView)
17 view.addSubview(button)
18
19 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
20 tableView.dataSource = self
21
22 button.addTarget(self, action: #selector(selectImages), for: .touchUpInside)
23 button.setTitle("追加", for: .normal)
24 }
25
26 // ボタンが押された時の処理
27 @objc func selectImages(_ sender: UIButton) {
28 let imagePicker = DKImagePickerController()
29 //選択できる写真の最大数を指定
30 imagePicker.maxSelectableCount = 3
31
32 //カメラモード、写真モードの選択
33 imagePicker.sourceType = .photo
34
35 //キャンセルボタンの有効化
36 imagePicker.showsCancelButton = true
37
38 //UIのカスタマイズ
39// imagePicker.UIDelegate = CustomUIDelegate()
40
41 imagePicker.didSelectAssets = { (assets: [DKAsset]) in
42 // ここでは一旦全削除する
43 self.photos.removeAll()
44
45 // assets に保存された枚数
46 self.selectedCount = assets.count
47
48 for asset in assets {
49 // asset からのダウンロードは非同期(iCloudなどにアクセスするため)
50 asset.fetchFullScreenImage(completeBlock: { (image, info) in
51 // もし image が nil だったら早期リターン
52 guard let image = image else {
53 self.selectedCount -= 1
54 return
55 }
56
57 // photos に追加
58 self.photos.append(image)
59
60 // reloadImage 内部で UITableView を操作しているため
61 // メインスレッドで実行
62 DispatchQueue.main.async {
63 self.reloadImage()
64 }
65 })
66 }
67 }
68
69 // ここでDKImagePickerを表示
70 present(imagePicker, animated: true, completion: nil)
71 }
72
73 // Asset の読み込みは非同期なので、全てダウンロードされた場合に再描画させる
74 func reloadImage() {
75 // photos.count と asset.count が等しければ tableView を再描画
76 if photos.count == selectedCount {
77 tableView.reloadData()
78 }
79 }
80
81 override func viewWillLayoutSubviews() {
82 super.viewWillLayoutSubviews()
83
84 let topInset = view.safeAreaInsets.top
85 let bottomInset = view.safeAreaInsets.bottom
86 print(topInset, bottomInset)
87 let height = view.frame.height - (topInset + bottomInset)
88 let width = view.frame.width
89 print(height)
90 tableView.frame = CGRect(x: 0, y: topInset, width: width, height: height - 30)
91 button.frame = CGRect(x: 0, y: topInset + height - 30, width: width, height: 30)
92 }
93}
94
95extension ViewController: UITableViewDataSource {
96 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
97 return photos.count
98 }
99
100 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
101 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
102
103 cell.imageView?.image = photos[indexPath.row]
104 cell.textLabel?.text = String(indexPath.row)
105
106 return cell
107 }
108}
UI系はコードベースでかいているので、そのままコピーしていただければそのままで動くと思います。
以下、コメントをつけての追記です。
電子書籍については、Amazon以外でも次のリンク先で販売されていますので、参考にされるといいかと思います。
物によってはAmazonと同じ物が販売されている上、これらの多くはPDFでも頒布されているので、特別なアプリを入れなくても読めますし、ご自身でご利用される分には複数端末へのコピーもできますので(もちろん許諾された範囲で)、用途に合わせてお選びいただくといいかと思います。
-- リアクティブプログラミング(RxSwift)をはじめ、かなりコアな分野の書籍が販売されています。書籍によっては無料なのに有益な記事を見つけることが可能です。
-- クラウドファウンディングベースの電子書籍(一部プリントアウトサービスあり)です。Booth に比べると比較的高価な書籍も多いのですが、その分高度な内容や実務につかなければ得られないような内容について記述された書籍も多いので、すぐには参考にならなくとも、その存在は覚えておいて損はないと思います。
-- 最近立ち上がった電子書籍サイトです。一部、Boothで取り扱っている内容と同じ書籍もありますが、BOOK TECH は割引も多く、時期によっては登録しただけで相当額のボーナスポイントももらえるので、Booth と比較検討しながら選ぶと良いかもしれません。