My galleryCollectionView
is currently being populated with images from Firebase
Database.
I'm having trouble figuring out how to allow the user to long press on an image, and save the selected photo to Photo Library. Right now I am currently stuck on getting the long press to work.
Here is my ViewController
(I'm using Swift 4):
class PhotoGalleryViewController: UIViewController, UICollectionViewDataSource, UIGestureRecognizerDelegate {
@IBOutlet weak var galleryCollectionView: UICollectionView!
var images = [GalleryImages]()
var customImageFlowLayout: CustomGalleryCollectionFlowLayout!
var dbRef: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
let photoLngPrs = UILongPressGestureRecognizer(target: self, action: "handleLongPress")
photoLngPrs.minimumPressDuration = 0.5
photoLngPrs.delegate = self
photoLngPrs.delaysTouchesBegan = true
self.galleryCollectionView.addGestureRecognizer(photoLngPrs)
dbRef = Database.database().reference().child("photoGallery")
customImageFlowLayout = CustomGalleryCollectionFlowLayout()
galleryCollectionView.collectionViewLayout = customImageFlowLayout
galleryCollectionView.backgroundColor = UIColor.black
loadGalleryDB()
// Do any additional setup after loading the view.
}
func loadGalleryDB() {
dbRef.observe(DataEventType.value, with: {(snapshot) in
var newGalleryImages = [GalleryImages]()
for galleryImagesSnapshot in snapshot.children {
let galleryImagesObject = GalleryImages(snapshot: galleryImagesSnapshot as! DataSnapshot )
newGalleryImages.append(galleryImagesObject)
}
self.images = newGalleryImages
self.galleryCollectionView.reloadData()
})
}
func handleLongPress(gestureRecognizer : UILongPressGestureRecognizer) {
if gestureRecognizer.state == UIGestureRecognizerState.began {
return
}
let point = gestureRecognizer.location(in: self.galleryCollectionView)
let indexPath = galleryCollectionView.indexPathForItem(at: point)
if let index = indexPath {
var collectionCell = galleryCollectionView.cellForItem(at: index)
print(index.row)
} else {
print("Could not find Index Path")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return images.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "galleryCell", for: indexPath) as! GalleryCollectionViewCell
let image = images[indexPath.row]
cell.galleryView.sd_setImage(with: URL(string: image.url), placeholderImage: UIImage(named: "NightCLubPhoto"))
cell.galleryView.isUserInteractionEnabled = true
return cell
}
Im getting this error.
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Hookaholics.PhotoGalleryViewController handleLongPress]: unrecognized selector sent to instance 0x7fa61bc0d7a0'
Here's my solution for the cases similar to yours.
You create a UILongPressGestureRecognizer
and add it to your CollectionView
.
func createLongPressGesture(){
let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPressOccured(sender:)))
longPress.minimumPressDuration = 0.7 // Default `minimumPressDuration` is 0.5. It sets the time after which UILongPressGestureRecognizer enters the 'began' state.
longPress.isEnabled = true
self.galleryCollectionView.addGestureRecognizer(longPress)
}
You can cal this function inside viewDidLoad
.
Next step is to implement the selector:
@objc func longPressOccured(sender:UILongPressGestureRecognizer){
guard sender.state == .began else{ return }
guard let pressedIndexPath = self.galleryCollectionView.indexPathForItem(at: sender.location(in: self.galleryCollectionView)) else { return }
guard let pressedCell = self.galleryCollectionView.cellForItem(at: pressedIndexPath) else { return }
let cell = pressedCell as! GalleryCollectionViewCell
// HERE comes your code for saving the selected image
}
Hope I got you problem right and my solution is helpful.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.