Skip to content

Commit 56260ed

Browse files
committed
feat: handle order button select view
1 parent 7c69a31 commit 56260ed

File tree

4 files changed

+165
-51
lines changed

4 files changed

+165
-51
lines changed

ios/CustomPhotoPicker/CustomPhotoPickerViewController.swift

Lines changed: 110 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//
88

99
import Foundation
10+
import Photos
1011
import TLPhotoPicker
1112

1213
class CustomPhotoPickerViewController: TLPhotosPickerViewController, ViewerControllerDataSource {
@@ -64,6 +65,8 @@ class CustomPhotoPickerViewController: TLPhotosPickerViewController, ViewerContr
6465
let footerView = PreviewFooterView()
6566
footerView.viewDelegate = self
6667

68+
self.viewerController?.delegate = self
69+
6770
self.viewerController!.footerView = footerView
6871
}
6972

@@ -96,10 +99,6 @@ class CustomPhotoPickerViewController: TLPhotosPickerViewController, ViewerContr
9699
}
97100
}
98101

99-
func cellOnLongPress(_: Cell) {
100-
//
101-
}
102-
103102
override func viewWillAppear(_ animated: Bool) {
104103
super.viewWillAppear(animated)
105104
self.navigationController?.setNavigationBarHidden(true, animated: true)
@@ -123,7 +122,112 @@ extension CustomPhotoPickerViewController: PreviewHeaderViewDelegate, PreviewFoo
123122
}
124123
}
125124

126-
func footerView(_: PreviewFooterView, didPressSelectButton _: UIButton) {
127-
self.viewerController?.dismiss(nil)
125+
private func canSelect(phAsset: PHAsset) -> Bool {
126+
if let closure = self.canSelectAsset {
127+
return closure(phAsset)
128+
} else if let delegate = self.delegate {
129+
return delegate.canSelectAsset(phAsset: phAsset)
130+
}
131+
return true
132+
}
133+
134+
private func getSelectedAssets(_ asset: TLPHAsset) -> TLPHAsset? {
135+
if let index = self.selectedAssets.firstIndex(where: { $0.phAsset == asset.phAsset }) {
136+
return self.selectedAssets[index]
137+
}
138+
return nil
139+
}
140+
141+
private func orderUpdateCells() {
142+
let visibleIndexPaths = self.collectionView.indexPathsForVisibleItems.sorted(by: { $0.row < $1.row })
143+
144+
for indexPath in visibleIndexPaths {
145+
guard let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell,
146+
let localID = cell.asset?.localIdentifier,
147+
let asset = TLPHAsset.asset(with: localID) else { continue }
148+
149+
if let selectedAsset = getSelectedAssets(asset) {
150+
cell.selectedAsset = true
151+
cell.orderLabel?.text = "\(selectedAsset.selectedOrder)"
152+
} else {
153+
cell.selectedAsset = false
154+
}
155+
}
156+
}
157+
158+
func footerView(_: PreviewFooterView, didPressSelectButton button: SelectButton) {
159+
let generator = UIImpactFeedbackGenerator(style: .medium)
160+
generator.impactOccurred()
161+
162+
if let indexPath = self.viewerController?.currentIndexPath {
163+
guard let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell, let localID = cell.asset?.localIdentifier else { return }
164+
165+
guard var asset = TLPHAsset.asset(with: localID), let phAsset = asset.phAsset else { return }
166+
167+
if let index = selectedAssets.firstIndex(where: { $0.phAsset == asset.phAsset }) {
168+
// deselect
169+
logDelegate?.deselectedPhoto(picker: self, at: indexPath.row)
170+
selectedAssets.remove(at: index)
171+
#if swift(>=4.1)
172+
selectedAssets = selectedAssets.enumerated().compactMap { offset, asset -> TLPHAsset? in
173+
var asset = asset
174+
asset.selectedOrder = offset + 1
175+
return asset
176+
}
177+
#else
178+
selectedAssets = selectedAssets.enumerated().flatMap { offset, asset -> TLPHAsset? in
179+
var asset = asset
180+
asset.selectedOrder = offset + 1
181+
return asset
182+
}
183+
#endif
184+
cell.selectedAsset = false
185+
button.selectedAsset = false
186+
self.orderUpdateCells()
187+
188+
} else {
189+
// select
190+
logDelegate?.selectedPhoto(picker: self, at: indexPath.row)
191+
guard !maxCheck(), self.canSelect(phAsset: phAsset) else { return }
192+
193+
asset.selectedOrder = selectedAssets.count + 1
194+
selectedAssets.append(asset)
195+
cell.selectedAsset = true
196+
button.selectedAsset = true
197+
cell.orderLabel?.text = "\(asset.selectedOrder)"
198+
button.setTitle("\(asset.selectedOrder)", for: .normal)
199+
}
200+
}
201+
}
202+
}
203+
204+
extension CustomPhotoPickerViewController: ViewerControllerDelegate {
205+
func viewerController(_ viewerController: ViewerController, didChangeFocusTo indexPath: IndexPath) {
206+
guard let footerView = viewerController.footerView as? PreviewFooterView else { return }
207+
208+
guard let button = footerView.selectButton else { return }
209+
210+
guard let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell, let localID = cell.asset?.localIdentifier else { return }
211+
212+
guard var asset = TLPHAsset.asset(with: localID) else { return }
213+
214+
if let index = selectedAssets.firstIndex(where: { $0.phAsset == asset.phAsset }) {
215+
button.selectedAsset = true
216+
button.setTitle("\(index + 1)", for: .normal)
217+
} else {
218+
button.selectedAsset = false
219+
}
220+
}
221+
222+
func viewerControllerDidDismiss(_: ViewerController) {
223+
//
224+
}
225+
226+
func viewerController(_: ViewerController, didFailDisplayingViewableAt _: IndexPath, error _: NSError) {
227+
//
228+
}
229+
230+
func viewerController(_: ViewerController, didLongPressViewableAt _: IndexPath) {
231+
//
128232
}
129233
}

ios/Preview/PreviewFooter.swift

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,64 +9,73 @@ import TLPhotoPicker
99
import UIKit
1010

1111
protocol PreviewFooterViewDelegate: AnyObject {
12-
func footerView(_ headerView: PreviewFooterView, didPressSelectButton button: UIButton)
12+
func footerView(_ headerView: PreviewFooterView, didPressSelectButton button: SelectButton)
1313
}
1414

15-
class PreviewFooterView: TLPhotoCollectionViewCell {
16-
weak var viewDelegate: PreviewFooterViewDelegate?
17-
18-
lazy var selectButton: UIButton = {
19-
let button = UIButton(type: .system)
15+
class SelectButton: UIButton {
16+
override init(frame: CGRect) {
17+
super.init(frame: frame)
2018

21-
button.addTarget(self, action: #selector(PreviewFooterView.selectAction(button:)), for: .touchUpInside)
22-
button.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
23-
//
24-
// button.layer.cornerRadius = 12
25-
// button.clipsToBounds = true
19+
self.frame.size = .init(width: 24, height: 24)
2620

27-
button.backgroundColor = config.selectedColor
21+
backgroundColor = .clear
2822

29-
button.layer.borderWidth = 1.5
30-
button.layer.borderColor = UIColor.white.cgColor
23+
layer.borderWidth = 2
24+
layer.borderColor = UIColor.white.cgColor
3125

32-
button.layer.cornerRadius = 16
33-
button.clipsToBounds = true
34-
button.contentEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
26+
layer.cornerRadius = 16
27+
clipsToBounds = true
28+
contentEdgeInsets = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)
3529

36-
button.setTitle("1", for: .normal)
37-
button.setTitleColor(.white, for: .normal)
30+
setTitleColor(.white, for: .normal)
31+
titleLabel?.font = .boldSystemFont(ofSize: 16)
3832

39-
button.translatesAutoresizingMaskIntoConstraints = false
33+
translatesAutoresizingMaskIntoConstraints = false
34+
}
4035

41-
// Tạo constraints để cố định vị trí của tiêu đề ở giữa tuyệt đối (absolute center)
36+
@objc open var selectedAsset: Bool = false {
37+
willSet(newValue) {
38+
backgroundColor = config.selectedColor
39+
if !newValue {
40+
backgroundColor = .clear
41+
setTitle("", for: .normal)
42+
}
43+
}
44+
}
4245

43-
// let label = UILabel()
44-
// label.text = "2"
45-
// label.textColor = UIColor.white // Tuỳ chỉnh màu văn bản theo ý muốn
46-
// label.textAlignment = .center
47-
// label.frame = button.bounds // Đặt kích thước và vị trí của UILabel bằng bằng với UIButton
48-
// button.addSubview(label)
46+
@available(*, unavailable)
47+
required init?(coder _: NSCoder) {
48+
fatalError("init(coder:) has not been implemented")
49+
}
50+
}
4951

50-
return button
51-
}()
52+
class PreviewFooterView: UIView {
53+
weak var viewDelegate: PreviewFooterViewDelegate?
54+
var selectButton: SelectButton!
5255

5356
override init(frame: CGRect) {
5457
super.init(frame: frame)
58+
5559
let stackView = UIStackView()
60+
61+
selectButton = SelectButton()
62+
63+
selectButton.addTarget(self, action: #selector(PreviewFooterView.selectAction(button:)), for: .touchUpInside)
64+
5665
stackView.translatesAutoresizingMaskIntoConstraints = false
5766
stackView.axis = .horizontal
5867
stackView.alignment = .trailing
5968
addSubview(stackView)
6069

61-
self.selectButton.translatesAutoresizingMaskIntoConstraints = false
62-
stackView.addArrangedSubview(self.selectButton)
70+
selectButton.translatesAutoresizingMaskIntoConstraints = false
71+
stackView.addArrangedSubview(selectButton)
6372

64-
self.selectButton.centerXAnchor.constraint(equalTo: stackView.centerXAnchor).isActive = true
65-
self.selectButton.centerYAnchor.constraint(equalTo: stackView.centerYAnchor).isActive = true
73+
selectButton.centerXAnchor.constraint(equalTo: stackView.centerXAnchor).isActive = true
74+
selectButton.centerYAnchor.constraint(equalTo: stackView.centerYAnchor).isActive = true
6675

6776
// (Tuỳ chọn) Đặt constraints cho chiều rộng và chiều cao của UIButton
68-
self.selectButton.widthAnchor.constraint(equalToConstant: 32).isActive = true
69-
self.selectButton.heightAnchor.constraint(equalToConstant: 32).isActive = true
77+
selectButton.widthAnchor.constraint(equalToConstant: 32).isActive = true
78+
selectButton.heightAnchor.constraint(equalToConstant: 32).isActive = true
7079

7180
NSLayoutConstraint.activate([
7281
stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20),
@@ -82,7 +91,7 @@ class PreviewFooterView: TLPhotoCollectionViewCell {
8291
super.layoutSubviews()
8392
}
8493

85-
@objc func selectAction(button: UIButton) {
86-
self.viewDelegate?.footerView(self, didPressSelectButton: button)
94+
@objc func selectAction(button: SelectButton) {
95+
viewDelegate?.footerView(self, didPressSelectButton: button)
8796
}
8897
}

ios/Preview/PreviewHeader.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,17 @@ class PreviewHeaderView: UIView {
2525

2626
button.setTitle(config.doneTitle, for: .normal)
2727
button.setTitleColor(.white, for: .normal)
28-
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: UIFont.systemFontSize)
28+
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: UIFont.labelFontSize)
2929
button.addTarget(self, action: #selector(PreviewHeaderView.doneAction(button:)), for: .touchUpInside)
30-
button.backgroundColor = config.selectedColor
3130

32-
button.contentEdgeInsets = UIEdgeInsets(top: 8, left: 14, bottom: 8, right: 14)
31+
// button.backgroundColor = config.selectedColor
3332

34-
button.layer.cornerRadius = 6.0
33+
// button.contentEdgeInsets = UIEdgeInsets(top: 8, left: 14, bottom: 8, right: 14)
34+
//
35+
// button.layer.cornerRadius = 6.0
3536

36-
button.setContentHuggingPriority(.required, for: .vertical)
37-
button.setContentCompressionResistancePriority(.required, for: .vertical)
37+
// button.setContentHuggingPriority(.required, for: .vertical)
38+
// button.setContentCompressionResistancePriority(.required, for: .vertical)
3839

3940
return button
4041
}()

ios/Viewer/ViewerController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import CoreData
22
import UIKit
33

4-
public protocol ViewerControllerDataSource: class {
4+
public protocol ViewerControllerDataSource: AnyObject {
55
func numberOfItemsInViewerController(_ viewerController: ViewerController) -> Int
66
func viewerController(_ viewerController: ViewerController, viewableAt indexPath: IndexPath) -> Viewable
77
}
88

9-
public protocol ViewerControllerDelegate: class {
9+
public protocol ViewerControllerDelegate: AnyObject {
1010
func viewerController(_ viewerController: ViewerController, didChangeFocusTo indexPath: IndexPath)
1111
func viewerControllerDidDismiss(_ viewerController: ViewerController)
1212
func viewerController(_ viewerController: ViewerController, didFailDisplayingViewableAt indexPath: IndexPath, error: NSError)

0 commit comments

Comments
 (0)