在UITapGestureRecognizer存在的情况下选择UICollectionViewCell

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在UITapGestureRecognizer存在的情况下选择UICollectionViewCell相关的知识,希望对你有一定的参考价值。

我想回应UICollectionViewCell选择:

private func setupCellAction() {
    collectionView?.rx.itemSelected
        .asObservable()
        .subscribe(onNext: { [weak self] indexPath in
            print("itemSelected!")
            let cell = self?.collectionView?.cellForItem(at: indexPath) as? CellTypeCollectionViewCell
            self?.performSegue(withIdentifier: "showBarchartSegue", sender: cell)
        }).disposed(by: disposeBag)
}

但不知怎的,onNext方法从未被称为。我尝试将setupCellAction()放入viewDidLoadviewWillAppearviewDidAppear,但它无效。任何建议将不胜感激。

更新

我尝试了以下主题的建议:How to select CollectionView cell in RxSwift

并在.debug("RX: Model selected")方法之前添加了subscribe。我在控制台中看到它已订阅一次的输出。

更新

我尝试用以下方式重写setupCellAction()

private func setupCellAction() {
    collectionView?.rx.modelSelected(CellTypeCollectionViewCell.self)
        .asObservable()
        .debug("RX: Model selected")
        .subscribe(onNext: { [weak self] cell in
            print("itemSelected!")
            self?.performSegue(withIdentifier: "showBarchartSegue", sender: cell)
        }).disposed(by: disposeBag)
}

它也不起作用。我也看到它在控制台中订阅了一次。

更新

UICollectionViewController被嵌入另一个容器UIViewController,在其中我定义了UITapGestureRecognizer。在评论出UITapGestureRecognizer的代码之后,itemSelected()方法开始起作用。现在我需要一种方法让tap事件通过,如果它发生在UICollectionViewCell上。有没有办法做到这一点?

在容器控制器(viewDidLoad)中点击的代码:

let tap = UITapGestureRecognizer(target: self, action: 
#selector(self.handleTap(_:)))
    tap.delegate = self
    view.addGestureRecognizer(tap)

handleTap():

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    tableView.isHidden = true
    searchBar.resignFirstResponder()
}
答案

您可以使用UIGestureRecognizerDelegate协议并实现func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool方法。

基本上,如果我正确理解问题,你需要在触摸false时返回UICollectionViewCell

您可以使用UICollectionView中的方法func indexPathForItem(at point: CGPoint) -> IndexPath?来完成此操作。如果给定的CGPoint与单元格的位置匹配,您将获得其IndexPath。

不要忘记将触摸位置转换为集合视图的框架 - 您可以使用UITouch的func location(in view: UIView?) -> CGPoint

它可能看起来像这样:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    let point = touch.location(in: collectionView)
    return collectionView.indexPathForItem(at: point) == nil
}

以上是关于在UITapGestureRecognizer存在的情况下选择UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章

UITapGestureRecognizer 被识别为 UILongPressGestureRecognizer

UITapGestureRecognizer 在完成之前不会更新 UIView

UITapGestureRecognizer 不适用于 UIView 动画

在 UITapGestureRecognizer 上添加参数

在 UITapGestureRecognizer 中更改字体

使用 UITapGestureRecognizer 无法识别的选择器