从Firebase数据库加载的UICollectionView保存照片

时间:2018-05-19 19:37:43

标签: ios swift uicollectionview

我的galleryCollectionView目前正在填充Firebase数据库中的图片。

我无法弄清楚如何让用户长按图像,并将所选照片保存到照片库。现在我正忙着让长按工作。

这是我的ViewController(我正在使用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
}

我收到此错误。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Hookaholics.PhotoGalleryViewController handleLongPress]: unrecognized selector sent to instance 0x7fa61bc0d7a0'

1 个答案:

答案 0 :(得分:0)

这是我与您相似的案例的解决方案。

您创建了UILongPressGestureRecognizer并将其添加到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)

}

您可以在viewDidLoad内加入此功能。

下一步是实现选择器:

@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

}

希望我能解决你的问题,我的解决方案很有帮助。