繁体   English   中英

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

[英]Saving Photos from UICollectionView loaded from Firebase Database

我的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'

这是我针对与您类似情况的解决方案。

您创建一个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

}

希望我能解决您的问题,我的解决方案会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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