Обнаружение касания UIViewCollectionCell внутри UITableViewCell - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу обнаружить касание изображения в uicollectionviewcell внутри uitableviewcell

Я использую ответ API для построения данных в моем табличном представлении

У меня есть этот ответ 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 (UIcollectionViewCell внутри BlockCell (TableviewCell). Как я могу это сделать? Или, может быть, какой-нибудь совет, как улучшить логику здесь?

Хорошо, я добавил жестраспознаватель, как это в 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);
            });
        }
    }
}

Но это все ещеработа. Я что-то пропустил?

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Если вы хотите использовать longTapGestureRecognizer, просто добавьте один к ячейке в вашем методе cellForItemAtIndexPath вашего collectionView, например:

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()
}
1 голос
/ 17 апреля 2019

Вы можете использовать следующий метод делегата 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);
                });
            }
        }
}
0 голосов
/ 23 апреля 2019

Чтобы все заработало, я бы рекомендовал изменить вашу функцию с

@IBAction func addGamePopUp(_ sender: UILongPressGestureRecognizer) {

до

@objc func addGamePopUp() {

И когда вы добавляете longTapGestureRecognizer в коллекцию collectionViewCell, он запускает этот метод, изменяя строку на:

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

Дайте мне знать, если это работает!

(psst: также уберите это, если проверьте ваш addGamePopupMethod, если вы идете по этому маршруту)

if (sender.state == UIGestureRecognizer.State.began){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...