Skip to content

Commit df154cf

Browse files
committed
1.代码结构优化
2.选择相册时丢失已选的问题 3.photos框架的滚动问题
1 parent c3e557e commit df154cf

9 files changed

+111
-158
lines changed

MTImagePicker/Demo/TableViewController.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ class ViewController: UITableViewController,MTImagePickerControllerDelegate {
8181
self.tableView.reloadData()
8282
}
8383

84-
84+
func imagePickerControllerDidCancel(picker: MTImagePickerController) {
85+
print("cancel")
86+
}
8587

8688
func btnPickTouch() {
8789
// 不推荐的写法,此处为了简便所以这样实现。

MTImagePicker/MTImagePicker/Common/Extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ extension ALAsset {
2929
class func getAssetFromUrlSync(lib:ALAssetsLibrary,url:NSURL) -> ALAsset? {
3030
let sema = DispatchSemaphore(value: 0)
3131
var result:ALAsset?
32-
DispatchQueue.global(priority: .default).async {
32+
DispatchQueue.global().async {
3333
lib.asset(for: url as URL!, resultBlock: { (asset) in
3434
result = asset
3535
sema.signal()

MTImagePicker/MTImagePicker/Controller/MTImagePickerAlbumsController.swift

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,8 @@ class MTImagePickerAlbumCell:UITableViewCell {
2424

2525
class MTImagePickerAlbumsController :UITableViewController {
2626

27-
var mediaTypes:[MTImagePickerMediaType] = [MTImagePickerMediaType.Photo]
28-
var source:MTImagePickerSource = .ALAsset
29-
var maxCount:Int = Int.max
30-
weak var delegate:MTImagePickerControllerDelegate?
31-
27+
weak var delegate:MTImagePickerDataSourceDelegate!
3228
private var dataSource = [MTImagePickerAlbumModel]()
33-
private var _source:MTImagePickerSource = .Photos
3429

3530
class var instance:MTImagePickerAlbumsController {
3631
get {
@@ -42,7 +37,7 @@ class MTImagePickerAlbumsController :UITableViewController {
4237

4338
override func viewDidLoad() {
4439
self.tableView.tableFooterView = UIView()
45-
MTImagePickerDataSource.fetch(type: self.source, mediaTypes: self.mediaTypes, complete: { (dataSource) in
40+
MTImagePickerDataSource.fetch(type: delegate.source, mediaTypes: delegate.mediaTypes, complete: { (dataSource) in
4641
self.dataSource = dataSource
4742
self.tableView.reloadData()
4843
})
@@ -69,13 +64,11 @@ class MTImagePickerAlbumsController :UITableViewController {
6964
func pushToMTImagePickerController(model:MTImagePickerAlbumModel,animate:Bool) {
7065
let controller = MTImagePickerAssetsController.instance
7166
controller.groupModel = model
72-
controller.delegate = self.delegate
73-
controller.maxCount = self.maxCount
74-
controller.source = self.source
67+
controller.delegate = delegate
7568
self.navigationController?.pushViewController(controller, animated: animate)
7669
}
7770
@IBAction func btnCancelTouch(_ sender: AnyObject) {
78-
self.dismiss(animated: true, completion: nil)
71+
self.delegate.didCancel()
7972
}
8073
}
8174

MTImagePicker/MTImagePicker/Controller/MTImagePickerAssetsController.swift

Lines changed: 18 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,15 @@ import Photos
1515

1616
class MTImagePickerAssetsController :UIViewController,UICollectionViewDataSource,UICollectionViewDelegate {
1717

18-
weak var delegate:MTImagePickerControllerDelegate?
19-
var maxCount: Int = Int.max
18+
weak var delegate:MTImagePickerDataSourceDelegate!
2019
var groupModel:MTImagePickerAlbumModel!
21-
var source:MTImagePickerSource = .ALAsset
2220

2321
@IBOutlet weak var collectionView: MTImagePickerCollectionView!
2422
@IBOutlet weak var lbSelected: UILabel!
2523
@IBOutlet weak var btnPreview: UIButton!
2624

2725
private var dataSource = [MTImagePickerModel]()
28-
private var selectedSource = Set<MTImagePickerModel>()
2926
private var initialScrollDone:Bool = false
30-
private var navigation:MTImagePickerController {
31-
get {
32-
return self.navigationController as! MTImagePickerController
33-
}
34-
}
3527

3628
class var instance:MTImagePickerAssetsController {
3729
get {
@@ -44,26 +36,24 @@ class MTImagePickerAssetsController :UIViewController,UICollectionViewDataSource
4436
//MARK: Lifecycle
4537
override func viewDidLoad() {
4638
super.viewDidLoad()
47-
let loading = LoadingViewController()
48-
loading.show(text: "Loading...".localized)
4939
if let title = self.groupModel.getAlbumName() {
5040
self.title = title
5141
}
42+
let loading = LoadingViewController()
43+
loading.show(text: "Loading...".localized)
5244
self.groupModel?.getMTImagePickerModelsListAsync { (models) in
5345
loading.dismiss()
5446
self.dataSource = models
5547
self.collectionView.reloadData()
5648
self.scrollToBottom()
5749
}
58-
59-
self.initUI()
6050
}
6151

6252
override func viewWillAppear(_ animated: Bool) {
6353
super.viewWillAppear(animated)
6454
self.collectionView.reloadData()
65-
self.lbSelected.text = String(self.selectedSource.count)
66-
self.btnPreview.isEnabled = !(self.selectedSource.count == 0)
55+
self.lbSelected.text = String(delegate.selectedSource.count)
56+
self.btnPreview.isEnabled = !(delegate.selectedSource.count == 0)
6757
}
6858

6959
override func viewDidLayoutSubviews() {
@@ -97,7 +87,7 @@ class MTImagePickerAssetsController :UIViewController,UICollectionViewDataSource
9787
}
9888
cell.imageView.image = model.getThumbImage(size: cell.imageView.frame.size)
9989
cell.indexPath = indexPath
100-
cell.btnCheck.isSelected = self.selectedSource.contains(model)
90+
cell.btnCheck.isSelected = delegate.selectedSource.contains(model)
10191
cell.btnCheck.addTarget(self, action: #selector(MTImagePickerAssetsController.btnCheckTouch(_:)), for: .touchUpInside)
10292
cell.leading.constant = self.collectionView.leading.constant
10393
cell.trailing.constant = self.collectionView.leading.constant
@@ -111,31 +101,26 @@ class MTImagePickerAssetsController :UIViewController,UICollectionViewDataSource
111101
}
112102

113103
@objc func btnCheckTouch(_ sender:UIButton) {
114-
if self.selectedSource.count < self.maxCount || sender.isSelected == true {
104+
if delegate.selectedSource.count < delegate.maxCount || sender.isSelected == true {
115105
sender.isSelected = !sender.isSelected
116-
let indexPath = (sender.superview?.superview as! MTImagePickerCell).indexPath
106+
let index = (sender.superview?.superview as! MTImagePickerCell).indexPath.row
117107
if sender.isSelected {
118-
self.selectedSource.insert(self.dataSource[(indexPath?.row)!])
108+
delegate.selectedSource.append(self.dataSource[index])
119109
sender.heartbeatsAnimation(duration: 0.15)
120110
}else {
121-
self.selectedSource.remove(self.dataSource[(indexPath?.row)!])
111+
if let removeIndex = delegate.selectedSource.index(of: self.dataSource[index]) {
112+
delegate.selectedSource.remove(at: removeIndex)
113+
}
122114
}
123-
self.lbSelected.text = String(self.selectedSource.count)
115+
self.lbSelected.text = String(delegate.selectedSource.count)
124116
self.lbSelected.heartbeatsAnimation(duration: 0.15)
125-
self.btnPreview.isEnabled = !(self.selectedSource.count == 0)
117+
self.btnPreview.isEnabled = !(delegate.selectedSource.count == 0)
126118
} else {
127119
let alertView = FlashAlertView(message: "Maxium selected".localized, delegate: nil)
128120
alertView.show()
129121
}
130122
}
131123

132-
func showUnAuthorize() {
133-
DispatchQueue.main.async {
134-
let alertView = UIAlertView(title: "Notice".localized, message: "照片访问权限被禁用,请前往系统设置->隐私->照片中,启用本程序对照片的访问权限", delegate: nil, cancelButtonTitle: "OK".localized)
135-
alertView.show()
136-
}
137-
}
138-
139124
//旋转处理
140125
override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) {
141126
if self.interfaceOrientation.isPortrait != toInterfaceOrientation.isPortrait {
@@ -154,54 +139,25 @@ class MTImagePickerAssetsController :UIViewController,UICollectionViewDataSource
154139
}
155140
}
156141

157-
private func initUI() {
158-
self.title = "All Photos".localized
159-
}
160-
161142
private func pushToImageSelectorPreviewController(initialIndexPath:IndexPath?,dataSource:[MTImagePickerModel]) {
162143
let vc = MTImagePickerPreviewController.instance
163144
vc.dataSource = dataSource
164-
vc.selectedSource = self.selectedSource
145+
vc.delegate = self.delegate
165146
vc.initialIndexPath = initialIndexPath
166-
vc.maxCount = self.maxCount
167-
vc.dismiss = {
168-
selectedSource in
169-
self.selectedSource = selectedSource
170-
self.collectionView.reloadData()
171-
}
172147
self.navigationController?.pushViewController(vc, animated: true)
173148
}
174149

175-
private func getSelectedSortedSource() -> [MTImagePickerModel] {
176-
var dataSource = [MTImagePickerModel]()
177-
for model in self.selectedSource.sorted(by: { return $0.sortNumber < $1.sortNumber}) {
178-
dataSource.append(model)
179-
}
180-
return dataSource
181-
}
182-
183150
//MARK: IBActions
184151
@IBAction func btnFinishTouch(_ sender: AnyObject) {
185-
let dataSource = self.getSelectedSortedSource()
186-
if self.source == .Photos {
187-
if #available(iOS 8.0, *) {
188-
self.delegate?.imagePickerController?(picker:self.navigation, didFinishPickingWithPhotosModels: dataSource as! [MTImagePickerPhotosModel])
189-
} else {
190-
// Fallback on earlier versions
191-
}
192-
} else {
193-
self.delegate?.imagePickerController?(picker:self.navigation, didFinishPickingWithAssetsModels: dataSource as! [MTImagePickerAssetsModel])
194-
}
195-
self.dismiss(animated: true, completion: nil)
152+
delegate.didFinishPicking()
196153
}
197154

198155
@IBAction func btnPreviewTouch(_ sender: AnyObject) {
199-
let dataSource = self.getSelectedSortedSource()
156+
let dataSource = delegate.selectedSource
200157
self.pushToImageSelectorPreviewController(initialIndexPath: nil, dataSource: dataSource)
201158
}
202159
@IBAction func btnCancelTouch(_ sender: AnyObject) {
203-
self.delegate?.imagePickerControllerDidCancel?(picker: self.navigation)
204-
self.dismiss(animated: true, completion: nil)
160+
delegate.didCancel()
205161
}
206162
}
207163

MTImagePicker/MTImagePicker/Controller/MTImagePickerController.swift

Lines changed: 40 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -25,69 +25,37 @@ import UIKit
2525
@objc optional func imagePickerControllerDidCancel(picker: MTImagePickerController)
2626
}
2727

28+
protocol MTImagePickerDataSourceDelegate:NSObjectProtocol {
29+
var selectedSource:[MTImagePickerModel] { get set }
30+
var maxCount:Int { get }
31+
var mediaTypes:[MTImagePickerMediaType] { get }
32+
var source:MTImagePickerSource { get }
33+
func didFinishPicking()
34+
func didCancel()
35+
}
2836

2937
public class MTImagePickerController:UINavigationController {
30-
31-
public weak var imagePickerDelegate:MTImagePickerControllerDelegate? {
32-
get {
33-
return self._delegate
34-
}
35-
set {
36-
self._delegate = newValue
37-
self.albumController?.delegate = newValue
38-
}
39-
}
40-
41-
public var mediaTypes:[MTImagePickerMediaType] {
42-
get {
43-
return self._mediaTypes
44-
}
45-
set {
46-
self._mediaTypes.removeAll()
47-
if newValue.contains(.Photo) {
48-
self._mediaTypes.append(.Photo)
49-
}
50-
if newValue.contains(.Video) {
51-
self._mediaTypes.append(.Video)
52-
}
53-
self.albumController?.mediaTypes = self._mediaTypes
54-
}
55-
}
56-
57-
public var maxCount: Int {
58-
get {
59-
return self._maxCount
60-
}
61-
set {
62-
if newValue > 0 {
63-
self._maxCount = newValue
64-
self.albumController?.maxCount = newValue
65-
}
66-
}
67-
}
6838

69-
public var defaultShowCameraRoll:Bool {
70-
get {
71-
return self._defaultAll
72-
}
73-
set {
74-
self._defaultAll = newValue
75-
}
76-
}
39+
public weak var imagePickerDelegate:MTImagePickerControllerDelegate?
40+
public var mediaTypes:[MTImagePickerMediaType] = [.Photo]
41+
public var maxCount: Int = Int.max
42+
public var defaultShowCameraRoll:Bool = true
43+
public var selectedSource = [MTImagePickerModel]()
44+
private var _source = MTImagePickerSource.ALAsset
7745
public var source:MTImagePickerSource {
7846
get {
7947
return self._source
8048
}
8149
set {
8250
self._source = newValue
51+
// 只有iOS8以上才能使用Photos框架
8352
if newValue == .Photos {
8453
if #available(iOS 8.0, *) {
8554

8655
} else {
8756
self._source = .ALAsset
8857
}
8958
}
90-
self.albumController?.source = self._source
9159
}
9260
}
9361

@@ -116,30 +84,44 @@ public class MTImagePickerController:UINavigationController {
11684
public override func viewWillAppear(_ animated: Bool) {
11785
if self.defaultShowCameraRoll {
11886
let controller = MTImagePickerAssetsController.instance
119-
controller.delegate = self.imagePickerDelegate
120-
controller.maxCount = self.maxCount
121-
controller.source = self.source
87+
controller.delegate = self
12288
MTImagePickerDataSource.fetchDefault(type: self.source, mediaTypes: self.mediaTypes) {
12389
controller.groupModel = $0
12490
self.pushViewController(controller, animated: false)
12591
}
12692
}
12793
}
128-
94+
12995
class var instance:MTImagePickerController {
13096
get {
13197
let controller = MTImagePickerAlbumsController.instance
13298
let navigation = MTImagePickerController(rootViewController: controller)
133-
navigation.albumController = controller
99+
controller.delegate = navigation
134100
return navigation
135101
}
136102
}
103+
}
137104

138-
public weak var _delegate:MTImagePickerControllerDelegate?
139-
private var _mediaTypes = [MTImagePickerMediaType.Photo]
140-
private var _maxCount:Int = Int.max
141-
private var _defaultAll:Bool = true
142-
private var _source = MTImagePickerSource.ALAsset
143-
private weak var albumController:MTImagePickerAlbumsController?
105+
extension MTImagePickerController:MTImagePickerDataSourceDelegate {
106+
107+
func didFinishPicking() {
108+
if self.source == .Photos {
109+
if #available(iOS 8.0, *) {
110+
self.imagePickerDelegate?.imagePickerController?(picker:self, didFinishPickingWithPhotosModels: selectedSource as! [MTImagePickerPhotosModel])
111+
} else {
112+
// Fallback on earlier versions
113+
}
114+
} else {
115+
self.imagePickerDelegate?.imagePickerController?(picker:self, didFinishPickingWithAssetsModels: selectedSource as! [MTImagePickerAssetsModel])
116+
}
117+
self.dismiss(animated: true, completion: nil)
118+
}
119+
120+
func didCancel() {
121+
imagePickerDelegate?.imagePickerControllerDidCancel?(picker: self)
122+
self.dismiss(animated: true, completion: nil)
123+
}
144124

145125
}
126+
127+

0 commit comments

Comments
 (0)