我的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'
答案 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
}
希望我能解决你的问题,我的解决方案很有帮助。