简体   繁体   中英

Saving Photos from UICollectionView loaded from Firebase Database

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM