ios - 检测点击 UITableViewCell 中的 UIViewCollectionCell

标签 ios swift uitableview uicollectionview

我想在 uitableviewcell 内的 uicollectionviewcell 中检测对 imageview 的点击

我正在使用 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
}

我正在这个 Controller 中获取方 block 和元素。现在我想在 gamecollectionCell(BlockCell(TableviewCell)内的 UIcollectionViewCell)中的图像上使用 LongTapGestureRecognizer 检测点击。我该怎么做?或者可能有任何建议如何改进这里的逻辑?

好的,我在 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);
            });
        }
    }
}

但是还是不行。我错过了什么吗?

最佳答案

如果您想使用长 TapGestureRecognizer,只需将一个添加到 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()
}

关于ios - 检测点击 UITableViewCell 中的 UIViewCollectionCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55732683/

相关文章:

ios - ReactiveSwift 中 PublishSubject 的等价物是什么?

ios - 是否可以在 sprite-kit 游戏中使用 Twitter/Facebook 分享按钮?

ios - 问题检测按钮 cellForRowAt

swift - 完成另一个 Alamofire 请求后运行 Alamofire 请求

ios - 在CarbonKit中哪里使用setCurrentTabIndex?

ios - 如何重新加载导航栏

ios - 如何从 API 访问文本响应。 swift ?

ios - 如何访问 UICollectionViewController header 中的 UISegmentedControl?

ios - 重用 UITableViewCell 与不同的数据

ios - 为什么 UITableViewCell 在改变高度时会闪烁?