检测UITableViewCell内部的UIViewCollectionCell上的点击

时间:2019-04-17 17:00:23

标签: ios swift uitableview uicollectionview

我想在uitableviewcell内的uicollectionviewcell中检测到图像视图上的点击

我正在使用api响应在我的tableview中建立数据

我有以下API响应:

{"status":1,"data":{"blocks":[{"name":"CustomBlock","description":"CustomDescription","itemsType":"game","items":[510234,78188,15719,37630]}], "items":[{"id:"1", name: "testgame"}]}

BlocksViewController.swift

class BlocksViewController: UIViewController, UITableViewDataSource, UICollectionViewDataSource, UICollectionViewDelegate, UITableViewDelegate {
var blocks = [Block]() // I'm getting blocks in this controller
var items : BlockItem! // and items
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return blocks[collectionView.tag].items.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GameCollectionCell", for: indexPath) as? GameCollectionCell else { return
        UICollectionViewCell() }

    if let found = items.game.first(where: {$0.id == String(blocks[collectionView.tag].items[indexPath.row])}) {
        cell.gameName.text = found.name
        cell.gameImage.kf.indicatorType = .activity

        let processor = DownsamplingImageProcessor(size: CGSize(width: 225, height: 300))
        cell.gameImage.kf.setImage(
            with: URL(string: found.background_image ?? ""),
            options: [
                .processor(processor),
                .scaleFactor(UIScreen.main.scale),
                .transition(.fade(0.2)),
                .cacheOriginalImage
            ])
    }
    else {
        cell.gameName.text = ""
        cell.gameImage.image = nil
    }
    return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return blocks.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "BlockCell") as? BlockCell else { return UITableViewCell() }
    cell.blockName.text = blocks[indexPath.row].name
    cell.blockDescription.text = blocks[indexPath.row].description
    cell.setScrollPosition(x: offsets[indexPath] ?? 0)
    cell.gameCollectionCell.delegate = self
    cell.gameCollectionCell.dataSource = self
    cell.gameCollectionCell.tag = indexPath.row
    cell.gameCollectionCell.reloadData()
    return cell
}

我正在此控制器中获取块和物品。现在我想使用LongTapGestureRecognizer在gamecollectionCell(BlockCell(TableviewCell)内的UIcollectionViewCell)上的图像上检测点击。我该怎么办呢?或者也许有任何建议可以改善这里的逻辑?

好的,我已经在cellForItemAt中添加了这样的手势识别器:

cell.addGestureRecognizer(UILongPressGestureRecognizer.init(target: self, action: #selector(addGamePopUp)))

然后我需要在长按时为uiimageview设置动画。

var selectedGameCell : GameCollectionCell?

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.selectedGameCell = collectionView.dequeueReusableCell(withReuseIdentifier: "GameCollectionCell", for: indexPath) as? GameCollectionCell 
}

@IBAction func addGamePopUp(_ sender: UILongPressGestureRecognizer) {
    if (sender.state == UIGestureRecognizer.State.began){
        UIView.animate(withDuration: 0.3, animations: {
            self.selectedGameCell?.gameImage.transform = CGAffineTransform(scaleX: 0.95,y: 0.95);
        }) { (Bool) in
            UIView.animate(withDuration: 0.3, animations: {
                self.selectedGameCell?.gameImage.transform = CGAffineTransform(scaleX: 1,y: 1);
            });
        }
    }
}

但是它仍然不起作用。我错过了什么吗?

4 个答案:

答案 0 :(得分:1)

您可以使用uicollectionview的以下委托方法来检测对集合视图单元格的点击。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
    print("cell tapped")
}

要添加长按手势,请在单元格中为在indexpath方法中的项添加以下代码:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell : GameCollectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! GameCollectionCell

        cell.backgroundColor = model[collectionView.tag][indexPath.item]

        let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(addGamePopUp(_:)))
       cell.addGestureRecognizer(lpgr)

        return cell
 }


@IBAction func addGamePopUp(_ sender: UILongPressGestureRecognizer){
        print("add game popup")
        if (sender.state == UIGestureRecognizer.State.began){
            UIView.animate(withDuration: 0.3, animations: {
                self.selectedGameCell?.gameImage?.transform = CGAffineTransform(scaleX: 0.95,y: 0.95);
            }) { (Bool) in
                UIView.animate(withDuration: 0.3, animations: {
                    self.selectedGameCell?.gameImage?.transform = CGAffineTransform(scaleX: 1,y: 1);
                });
            }
        }
}

答案 1 :(得分:1)

如果要使用longTapGestureRecognizer,只需向collectionView的cellForItemAtIndexPath方法的单元格中添加一个,如下所示:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SubjectCellId", for: indexPath) as? SubjectCell {
        cell.addGestureRecognizer(UILongPressGestureRecognizer.init(target: self, action: #selector(someMethod)))

        return cell
    }

    return UICollectionViewCell()
}

答案 2 :(得分:0)

为了使事情顺利进行,建议您从

更改功能

@IBAction func addGamePopUp(_ sender: UILongPressGestureRecognizer) {

@objc func addGamePopUp() {

在将longTapGestureRecognizer添加到collectionViewCell时,您可以通过将行更改为以下内容来触发该方法:

cell.addGestureRecognizer(UILongPressGestureRecognizer.init(target: self, action: #selector(addGamePopUp)))

让我知道是否可行!

(注意:如果您要沿着这条路线,请在addGamePopupMethod中签入,也要删除它)

if (sender.state == UIGestureRecognizer.State.began){

答案 3 :(得分:0)

您可以在表格视图单元格内使用touchesBegan方法,并从触摸位置获取其中的集合视图单元格对象。

注意:在实现此方法时,不会为TableViewCell调用didSelectRow方法。

extension TableViewCell {
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let touch = touches.first {
                let point = touch.location(in: self)
                if let path = collectionView.indexPathForItem(at: point) {
                    //Get cell of collection view from this index path
                } 
            }
        }
    }