Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add long press preview for images #252

Merged
merged 1 commit into from
Jan 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions TLPhotoPicker/Classes/TLPhotoCollectionViewCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ open class TLPhotoCollectionViewCell: UICollectionViewCell {
}
}

open internal(set) var asset: PHAsset?

@objc open var isCameraCell = false

open var duration: TimeInterval? {
Expand Down
170 changes: 118 additions & 52 deletions TLPhotoPicker/Classes/TLPhotosPickerViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ public struct TLPhotosPickerConfigure {
public var cancelTitle = "Cancel"
public var doneTitle = "Done"
public var emptyMessage = "No albums"
public var selectMessage = "Select"
public var deselectMessage = "Deselect"
public var emptyImage: UIImage? = nil
public var usedCameraButton = true
public var usedPrefetch = false
Expand Down Expand Up @@ -222,6 +224,12 @@ open class TLPhotosPickerViewController: UIViewController {

open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)

if traitCollection.forceTouchCapability == .available {
registerForPreviewing(with: self, sourceView: collectionView)
}


if #available(iOS 13.0, *) {
let userInterfaceStyle = self.traitCollection.userInterfaceStyle
let image = TLBundle.podBundleImage(named: "pop_arrow")
Expand Down Expand Up @@ -880,59 +888,15 @@ extension TLPhotosPickerViewController: UICollectionViewDelegate,UICollectionVie
//Delegate
open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let collection = self.focusedCollection, let cell = self.collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell else { return }

let isCameraRow = collection.useCameraButton && indexPath.section == 0 && indexPath.row == 0

if isCameraRow {
if Platform.isSimulator {
print("not supported by the simulator.")
return
}else {
if self.configure.cameraCellNibSet?.nibName != nil {
cell.selectedCell()
}else {
showCameraIfAuthorized()
}
self.logDelegate?.selectedCameraCell(picker: self)
return
}
}
guard var asset = collection.getTLAsset(at: indexPath), let phAsset = asset.phAsset else { return }
cell.popScaleAnim()
if let index = self.selectedAssets.firstIndex(where: { $0.phAsset == asset.phAsset }) {
//deselect
self.logDelegate?.deselectedPhoto(picker: self, at: indexPath.row)
self.selectedAssets.remove(at: index)
#if swift(>=4.1)
self.selectedAssets = self.selectedAssets.enumerated().compactMap({ (offset,asset) -> TLPHAsset? in
var asset = asset
asset.selectedOrder = offset + 1
return asset
})
#else
self.selectedAssets = self.selectedAssets.enumerated().flatMap({ (offset,asset) -> TLPHAsset? in
var asset = asset
asset.selectedOrder = offset + 1
return asset
})
#endif
cell.selectedAsset = false
cell.stopPlay()
self.orderUpdateCells()
if self.playRequestID?.indexPath == indexPath {
stopPlay()
}
}else {
//select
self.logDelegate?.selectedPhoto(picker: self, at: indexPath.row)
guard !maxCheck() else { return }
guard canSelect(phAsset: phAsset) else { return }
asset.selectedOrder = self.selectedAssets.count + 1
self.selectedAssets.append(asset)
cell.selectedAsset = true
cell.orderLabel?.text = "\(asset.selectedOrder)"
if asset.type != .photo, self.configure.autoPlay {
playVideo(asset: asset, indexPath: indexPath)
}
selectCameraCell(cell)
return
}

toggleSelection(for: cell, at: indexPath)
}

open func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
Expand Down Expand Up @@ -970,6 +934,9 @@ extension TLPhotosPickerViewController: UICollectionViewDelegate,UICollectionVie
return cell
}
guard let asset = collection.getTLAsset(at: indexPath) else { return cell }

cell.asset = asset.phAsset

if let selectedAsset = getSelectedAssets(asset) {
cell.selectedAsset = true
cell.orderLabel?.text = "\(selectedAsset.selectedOrder)"
Expand Down Expand Up @@ -1139,7 +1106,7 @@ extension TLPhotosPickerViewController: UICollectionViewDelegateFlowLayout {
}

// MARK: - UITableView datasource & delegate
extension TLPhotosPickerViewController: UITableViewDelegate,UITableViewDataSource {
extension TLPhotosPickerViewController: UITableViewDelegate, UITableViewDataSource {
//delegate
open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.logDelegate?.selectedAlbum(picker: self, title: self.collections[indexPath.row].title, at: indexPath.row)
Expand Down Expand Up @@ -1175,10 +1142,109 @@ extension TLPhotosPickerViewController: UITableViewDelegate,UITableViewDataSourc
}
}

// MARK: - UIViewControllerPreviewingDelegate
extension TLPhotosPickerViewController: UIViewControllerPreviewingDelegate {
public func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let pressingIndexPath = collectionView.indexPathForItem(at: location) else { return nil }
guard let pressingCell = collectionView.cellForItem(at: pressingIndexPath) as? TLPhotoCollectionViewCell else { return nil }

previewingContext.sourceRect = pressingCell.frame
let previewController = TLAssetPreviewViewController()
previewController.asset = pressingCell.asset

return previewController
}

public func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {}

@available(iOS 13.0, *)
public func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
guard let cell = collectionView.cellForItem(at: indexPath) as? TLPhotoCollectionViewCell else { return nil }

return UIContextMenuConfiguration(identifier: nil, previewProvider: {
let previewController = TLAssetPreviewViewController()
previewController.asset = cell.asset
return previewController

}, actionProvider: { [weak self] suggestedActions in
guard let self = self else { return nil }
let isSelected = cell.selectedAsset
let title = isSelected ? self.configure.deselectMessage : self.configure.selectMessage
let imageName = isSelected ? "checkmark.circle" : "circle"
let toggleSelection = UIAction(title: title, image: UIImage(systemName: imageName)) { [weak self] action in
self?.toggleSelection(for: cell, at: indexPath)
}

return UIMenu(title: "", children: [toggleSelection])
}
)
}
}

extension TLPhotosPickerViewController {
func selectCameraCell(_ cell: TLPhotoCollectionViewCell) {
if Platform.isSimulator {
print("not supported by the simulator.")
} else {
if configure.cameraCellNibSet?.nibName != nil {
cell.selectedCell()
} else {
showCameraIfAuthorized()
}
logDelegate?.selectedCameraCell(picker: self)
}
}

func toggleSelection(for cell: TLPhotoCollectionViewCell, at indexPath: IndexPath) {
guard let collection = focusedCollection, var asset = collection.getTLAsset(at: indexPath), let phAsset = asset.phAsset else { return }

cell.popScaleAnim()

if let index = selectedAssets.firstIndex(where: { $0.phAsset == asset.phAsset }) {
//deselect
logDelegate?.deselectedPhoto(picker: self, at: indexPath.row)
selectedAssets.remove(at: index)
#if swift(>=4.1)
selectedAssets = selectedAssets.enumerated().compactMap({ (offset,asset) -> TLPHAsset? in
var asset = asset
asset.selectedOrder = offset + 1
return asset
})
#else
selectedAssets = selectedAssets.enumerated().flatMap({ (offset,asset) -> TLPHAsset? in
var asset = asset
asset.selectedOrder = offset + 1
return asset
})
#endif
cell.selectedAsset = false
cell.stopPlay()
orderUpdateCells()
if playRequestID?.indexPath == indexPath {
stopPlay()
}
} else {
//select
logDelegate?.selectedPhoto(picker: self, at: indexPath.row)
guard !maxCheck(), canSelect(phAsset: phAsset) else { return }

asset.selectedOrder = selectedAssets.count + 1
selectedAssets.append(asset)
cell.selectedAsset = true
cell.orderLabel?.text = "\(asset.selectedOrder)"

if asset.type != .photo, configure.autoPlay {
playVideo(asset: asset, indexPath: indexPath)
}
}

}
}

extension Array where Element == PopupConfigure {
var duration: TimeInterval {
var result: TimeInterval = 0.1
self.compactMap{ $0 as? PopupConfigure }.forEach{
forEach {
if case let .animation(duration) = $0 {
result = duration
}
Expand Down
4 changes: 4 additions & 0 deletions TLPhotoPicker/TLPhotoPicker.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
189E996E21F8BA7F00A754E4 /* TLPhotopickerDataSourcesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189E996C21F8BA7F00A754E4 /* TLPhotopickerDataSourcesProtocol.swift */; };
189E996F21F8BA7F00A754E4 /* TLAssetCollection+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189E996D21F8BA7F00A754E4 /* TLAssetCollection+Extension.swift */; };
18A3E62D224FADAD009A9567 /* SynchronizedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A3E62C224FADAD009A9567 /* SynchronizedDictionary.swift */; };
B8E49AB223CC5FE900626917 /* TLAssetPreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8E49AB123CC5FE900626917 /* TLAssetPreviewViewController.swift */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand All @@ -42,6 +43,7 @@
189E996C21F8BA7F00A754E4 /* TLPhotopickerDataSourcesProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TLPhotopickerDataSourcesProtocol.swift; path = Classes/TLPhotopickerDataSourcesProtocol.swift; sourceTree = SOURCE_ROOT; };
189E996D21F8BA7F00A754E4 /* TLAssetCollection+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "TLAssetCollection+Extension.swift"; path = "Classes/TLAssetCollection+Extension.swift"; sourceTree = SOURCE_ROOT; };
18A3E62C224FADAD009A9567 /* SynchronizedDictionary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SynchronizedDictionary.swift; path = Classes/SynchronizedDictionary.swift; sourceTree = SOURCE_ROOT; };
B8E49AB123CC5FE900626917 /* TLAssetPreviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TLAssetPreviewViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -76,6 +78,7 @@
children = (
18465DBA206E8AFD0015A715 /* TLPhotoPickerController.bundle */,
18A3E62C224FADAD009A9567 /* SynchronizedDictionary.swift */,
B8E49AB123CC5FE900626917 /* TLAssetPreviewViewController.swift */,
18465DAC206E8AEB0015A715 /* TLAlbumPopView.swift */,
18465DAD206E8AEB0015A715 /* TLAssetsCollection.swift */,
189E996D21F8BA7F00A754E4 /* TLAssetCollection+Extension.swift */,
Expand Down Expand Up @@ -180,6 +183,7 @@
buildActionMask = 2147483647;
files = (
18465DB0206E8AEB0015A715 /* TLPhotosPickerViewController.swift in Sources */,
B8E49AB223CC5FE900626917 /* TLAssetPreviewViewController.swift in Sources */,
189E996E21F8BA7F00A754E4 /* TLPhotopickerDataSourcesProtocol.swift in Sources */,
18465DB6206E8AEB0015A715 /* TLAlbumPopView.swift in Sources */,
189E996F21F8BA7F00A754E4 /* TLAssetCollection+Extension.swift in Sources */,
Expand Down
Loading