Skip to content

Commit 38410c8

Browse files
committed
UIImageの比較をするように変更
1 parent 7b4f498 commit 38410c8

File tree

6 files changed

+75
-46
lines changed

6 files changed

+75
-46
lines changed

FormKit/Form/ImagePickerField/ImagePickerField.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class ImagePickerField: UIView, XibInitializable {
3434
}
3535

3636
public weak var delegate: ImagePickerFieldDelegate?
37-
private var images: [PickedImage] = []
37+
private var images: [UIImage] = []
3838

3939
required init?(coder aDecoder: NSCoder) {
4040
super.init(coder: aDecoder)
@@ -46,7 +46,7 @@ public class ImagePickerField: UIView, XibInitializable {
4646
setXibView()
4747
}
4848

49-
public func set(_ images: [PickedImage]) {
49+
public func set(_ images: [UIImage]) {
5050
self.images = images
5151
collectionView.reloadData()
5252
}
@@ -61,7 +61,7 @@ extension ImagePickerField: UICollectionViewDataSource {
6161
let cell = ImagePickerFieldCollectionViewCell
6262
.dequeue(from: collectionView, indexPath: indexPath)
6363
if indexPath.item <= images.count - 1 {
64-
return cell.configure(with: images[indexPath.item].image)
64+
return cell.configure(with: images[indexPath.item])
6565
} else {
6666
return cell.configure(with: .init(borderWidth: borderWidth,
6767
borderColor: borderColor,

FormKit/Form/ImagePickerViewController/Cell/Select/SelectImageCollectionViewCell.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ class SelectImageCollectionViewCell: UICollectionViewCell, AssetLoadable {
6161
}
6262

6363
@discardableResult
64-
func configure(with asset: PHAsset) -> Self {
65-
load(asset)
64+
func configure(with asset: PHAsset, completion: @escaping (UIImage?) -> Void) -> Self {
65+
load(asset, completion: completion)
6666
return self
6767
}
6868
}

FormKit/Form/ImagePickerViewController/ViewController/ImagePickerViewController.swift

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,8 @@
99
import UIKit
1010
import Photos
1111

12-
public struct PickedImage: Equatable {
13-
public let image: UIImage
14-
let albumIndexPath: IndexPath?
15-
}
16-
1712
public protocol ImagePickerViewControllerDelegate: class {
18-
func imagePickerViewController(_ imagePickerViewController: ImagePickerViewController, didSelectedImages images: [PickedImage])
13+
func imagePickerViewController(_ imagePickerViewController: ImagePickerViewController, didSelectedImages images: [UIImage])
1914
}
2015

2116
public class ImagePickerViewController: UIViewController {
@@ -58,7 +53,7 @@ public class ImagePickerViewController: UIViewController {
5853
private let emptyVC = EmptyViewController()
5954
private let cameraActionVC = CameraActionViewController()
6055

61-
private var pickedImages = [PickedImage]()
56+
private var pickedImages = [UIImage]()
6257
private var timer: Timer?
6358
private var canDelete = false {
6459
didSet {
@@ -72,7 +67,7 @@ public class ImagePickerViewController: UIViewController {
7267
return menuStackView.frame.width / CGFloat(Page.allCases.count)
7368
}
7469

75-
init(columnCount: Int, maxSelectCount: Int, pickedImages: [PickedImage]) {
70+
init(columnCount: Int, maxSelectCount: Int, pickedImages: [UIImage]) {
7671
self.columnCount = columnCount
7772
self.maxSelectCount = maxSelectCount
7873
self.pickedImages = pickedImages
@@ -200,7 +195,7 @@ extension ImagePickerViewController {
200195
case .ended, .cancelled:
201196
selectedCollectionView.endInteractiveMovement()
202197
if canDelete {
203-
timer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { [weak self] (timer) in
198+
timer = Timer.scheduledTimer(withTimeInterval: 4.0, repeats: false) { [weak self] (timer) in
204199
self?.canDelete = false
205200
}
206201
}
@@ -221,7 +216,7 @@ extension ImagePickerViewController: UICollectionViewDataSource {
221216

222217
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
223218
if indexPath.item <= pickedImages.count - 1 {
224-
let image = pickedImages[indexPath.item].image
219+
let image = pickedImages[indexPath.item]
225220
return SelectedImageCollectionViewCell
226221
.dequeue(from: collectionView, indexPath: indexPath)
227222
.configure(with: image, canDelete: canDelete, delegate: self)
@@ -261,7 +256,7 @@ extension ImagePickerViewController: UICollectionViewDelegate {
261256
}
262257

263258
public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
264-
previewImageView.image = pickedImages[indexPath.item].image
259+
previewImageView.image = pickedImages[indexPath.item]
265260
updatePreviewImageView(isHidden: false, animated: true)
266261
}
267262

@@ -356,20 +351,20 @@ extension ImagePickerViewController: SelectedImageCollectionViewCellDelegate {
356351
didTappedDeleteButton button: UIButton,
357352
with image: UIImage?) {
358353
guard let image = image,
359-
let pickedImage = pickedImages.first(where: { $0.image == image }) else { return }
354+
let pickedImage = pickedImages.first(where: { $0 == image }) else { return }
360355
albumVC.remove(pickedImage: pickedImage)
361356
}
362357
}
363358

364359
// MARK: AlbumViewController
365360

366361
extension ImagePickerViewController: AlbumViewControllerDelegate {
367-
func albumViewController(_ albumViewController: AlbumViewController, didInsertedItemAt indexPath: IndexPath, selectedImages: [PickedImage]) {
362+
func albumViewController(_ albumViewController: AlbumViewController, didInsertedItemAt indexPath: IndexPath, selectedImages: [UIImage]) {
368363
self.pickedImages = selectedImages
369364
insertImage(at: indexPath)
370365
}
371366

372-
func albumViewController(_ albumViewController: AlbumViewController, didRemovedItemAt indexPath: IndexPath, selectedImages: [PickedImage]) {
367+
func albumViewController(_ albumViewController: AlbumViewController, didRemovedItemAt indexPath: IndexPath, selectedImages: [UIImage]) {
373368
self.pickedImages = selectedImages
374369
deleteImage(at: indexPath)
375370
}
@@ -381,7 +376,7 @@ extension ImagePickerViewController: AlbumViewControllerDelegate {
381376
duration: 0.3,
382377
options: .transitionCrossDissolve,
383378
animations: {
384-
let image = self.pickedImages[indexPath.item].image
379+
let image = self.pickedImages[indexPath.item]
385380
cell.configure(with: image, canDelete: self.canDelete, delegate: self)
386381
},
387382
completion: { (finished) in
@@ -429,8 +424,8 @@ extension ImagePickerViewController: AlbumViewControllerDelegate {
429424

430425
extension ImagePickerViewController: CameraViewControllerDelegate {
431426
func cameraViewController(_ cameraViewController: CameraViewController, didCapturedImage image: UIImage) {
432-
albumVC.append(pickedImage: PickedImage(image: image,
433-
albumIndexPath: nil))
427+
// albumVC.append(pickedImage: PickedImage(image: image,
428+
// albumIndexPath: nil))
434429
}
435430
}
436431

FormKit/Form/ImagePickerViewController/ViewController/Main/AlbumViewController.swift

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import Photos
1212
protocol AlbumViewControllerDelegate: class {
1313
func albumViewController(_ albumViewController: AlbumViewController,
1414
didInsertedItemAt indexPath: IndexPath,
15-
selectedImages: [PickedImage])
15+
selectedImages: [UIImage])
1616
func albumViewController(_ albumViewController: AlbumViewController,
1717
didRemovedItemAt indexPath: IndexPath,
18-
selectedImages: [PickedImage])
18+
selectedImages: [UIImage])
1919
}
2020

2121
class AlbumViewController: UIViewController, Pageable {
@@ -34,11 +34,11 @@ class AlbumViewController: UIViewController, Pageable {
3434

3535
private var allAssets: PHFetchResult<PHAsset>?
3636
private let maxSelectCount: Int
37-
private var pickedImages = [PickedImage]()
37+
private var pickedImages = [UIImage]()
3838

3939
weak var delegate: AlbumViewControllerDelegate?
4040

41-
init(columnCount: Int, maxSelectCount: Int, pickedImages: [PickedImage]) {
41+
init(columnCount: Int, maxSelectCount: Int, pickedImages: [UIImage]) {
4242
self.columnCount = columnCount
4343
self.maxSelectCount = maxSelectCount
4444
self.pickedImages = pickedImages
@@ -63,13 +63,17 @@ extension AlbumViewController: UICollectionViewDataSource {
6363

6464
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
6565
guard let asset = allAssets?.object(at: indexPath.item) else { fatalError() }
66-
let hasPicked = pickedImages.compactMap { $0.albumIndexPath }.contains(indexPath)
67-
if hasPicked {
68-
collectionView.selectItem(at: indexPath, animated: false, scrollPosition: [])
69-
}
7066
return SelectImageCollectionViewCell
7167
.dequeue(from: collectionView, indexPath: indexPath)
72-
.configure(with: asset)
68+
.configure(with: asset, completion: { [weak self] image in
69+
guard let self = self, let image = image else { return }
70+
let hasPicked = self.pickedImages.contains(where: { $0.isEqualData(image) })
71+
if hasPicked {
72+
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: [])
73+
} else {
74+
self.collectionView.deselectItem(at: indexPath, animated: false)
75+
}
76+
})
7377
}
7478

7579
}
@@ -82,18 +86,16 @@ extension AlbumViewController: UICollectionViewDelegate {
8286
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
8387
guard let cell = collectionView.cellForItem(at: indexPath) as? SelectImageCollectionViewCell,
8488
let image = cell.imageView.image else { return }
85-
append(pickedImage: PickedImage(image: image,
86-
albumIndexPath: indexPath))
89+
append(pickedImage: image)
8790
}
8891

8992
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
9093
guard let cell = collectionView.cellForItem(at: indexPath) as? SelectImageCollectionViewCell,
9194
let image = cell.imageView.image else { return }
92-
remove(pickedImage: PickedImage(image: image,
93-
albumIndexPath: indexPath))
95+
remove(pickedImage: image)
9496
}
9597

96-
func append(pickedImage: PickedImage) {
98+
func append(pickedImage: UIImage) {
9799
let insertIndexPath = IndexPath(item: pickedImages.count, section: 0)
98100

99101
pickedImages.insert(pickedImage, at: insertIndexPath.item)
@@ -103,19 +105,26 @@ extension AlbumViewController: UICollectionViewDelegate {
103105
selectedImages: pickedImages)
104106
}
105107

106-
func remove(pickedImage: PickedImage) {
108+
func remove(pickedImage: UIImage) {
107109
let removeIndexPaths = pickedImages
108110
.enumerated()
109-
.filter { $0.element.albumIndexPath == pickedImage.albumIndexPath }
111+
.filter { $0.element.isEqualData(pickedImage) }
110112
.map { IndexPath(item: $0.offset, section: 0) }
111113

112114
guard let removeIndexPath = removeIndexPaths.first else { return }
113115

114-
pickedImages.removeAll { $0.albumIndexPath == pickedImage.albumIndexPath }
116+
pickedImages.removeAll { $0.isEqualData(pickedImage) }
115117

116-
if let albumIndexPath = pickedImage.albumIndexPath,
117-
collectionView.indexPathsForSelectedItems?.contains(albumIndexPath) == true {
118-
collectionView.deselectItem(at: albumIndexPath, animated: true)
118+
let indexPath = collectionView.indexPathsForVisibleItems
119+
.enumerated()
120+
.first(where: { (offset, element) -> Bool in
121+
let cell = collectionView.cellForItem(at: element) as? SelectImageCollectionViewCell
122+
let image = cell?.imageView.image
123+
return image?.isEqualData(pickedImage) == true
124+
})?
125+
.element
126+
if let indexPath = indexPath {
127+
collectionView.deselectItem(at: indexPath, animated: true)
119128
}
120129

121130
delegate?.albumViewController(self,
@@ -145,7 +154,14 @@ extension AlbumViewController: PHPhotoLibraryChangeObserver {
145154
guard let fetchedResult = allAssets,
146155
let changeDetails = changeInstance.changeDetails(for: fetchedResult) else { return }
147156
allAssets = changeDetails.fetchResultAfterChanges
148-
reload(for: changeDetails)
157+
reload()
158+
// reload(for: changeDetails)
159+
}
160+
161+
private func reload() {
162+
DispatchQueue.main.async {
163+
self.collectionView.reloadData()
164+
}
149165
}
150166

151167
private func reload(for changeDetails: PHFetchResultChangeDetails<PHAsset>) {
@@ -168,3 +184,20 @@ extension AlbumViewController: PHPhotoLibraryChangeObserver {
168184
}
169185
}
170186
}
187+
188+
extension UIImage {
189+
func isEqualData(_ image: UIImage) -> Bool {
190+
if !image.size.equalTo(self.size) {
191+
return false
192+
}
193+
194+
if let dataProvider1 = self.cgImage?.dataProvider,
195+
let dataProvider2 = image.cgImage?.dataProvider {
196+
if let data1 = dataProvider1.data,
197+
let data2 = dataProvider2.data {
198+
return data1 == data2
199+
}
200+
}
201+
return false
202+
}
203+
}

FormKit/Util/Helper/AssetLoadable.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extension AssetLoadable where Self: UICollectionViewCell {
2323
height: cellSize.height * scale)
2424
}
2525

26-
func load(_ asset: PHAsset) {
26+
func load(_ asset: PHAsset, completion: @escaping (UIImage?) -> Void) {
2727
self.assetIdentifier = asset.localIdentifier
2828
let targetSize = thumbnailSize(for: self.bounds.size)
2929
imageManager.requestImage(
@@ -34,6 +34,7 @@ extension AssetLoadable where Self: UICollectionViewCell {
3434
) { (image, _) in
3535
if self.assetIdentifier == asset.localIdentifier {
3636
self.thumbnailImage = image
37+
completion(image)
3738
}
3839
}
3940
}

Sample/ViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ extension ViewController: ImagePickerFieldDelegate {
144144
}
145145

146146
extension ViewController: ImagePickerViewControllerDelegate {
147-
func imagePickerViewController(_ imagePickerViewController: ImagePickerViewController, didSelectedImages images: [PickedImage]) {
148-
userRegistrationForm.images = images.map { $0.image }
147+
func imagePickerViewController(_ imagePickerViewController: ImagePickerViewController, didSelectedImages images: [UIImage]) {
148+
userRegistrationForm.images = images
149149
imagePickerField?.set(images)
150150
}
151151
}

0 commit comments

Comments
 (0)