检测位于另一个 uicollectionview 内的 uicollectionView 的哪个 UICollectionViewCell 位于中心

Posted

技术标签:

【中文标题】检测位于另一个 uicollectionview 内的 uicollectionView 的哪个 UICollectionViewCell 位于中心【英文标题】:Detect which UICollectionViewCell of a uicollectionView that is inside another uicollectionview is in the center 【发布时间】:2020-07-16 03:43:50 【问题描述】:

所以我有一个水平 UICollectionView 图像,它位于垂直 UICollectionView 内,当我从垂直单元格中选择一个单元格时,我想检测哪个单元格位于水平 UICollectionView 的中心 我试图发送一个通知并调用一个可以完成工作的函数,但由于它重复使用同一个单元格,所以它被多次调用,所以最后我没有得到适当的 indexPath。

而且当我点击图像时,水平collectionView的“didSelectItemAt”被调用,有没有办法让垂直collectionView被调用? 谢谢

【问题讨论】:

【参考方案1】:

您最好的选择是通过协议委托

为您的集合视图单元创建协议

protocol yourDelegate: class 
    
    func didSelectCell(WithIndecPath indexPath: IndexPath, InCollectionView collectionView: UICollectionView) -> Void
    

在您的单元格中,创建一个名为 setup 的函数,您可以在 cellForRow 中调用该函数。 在您的单元格中,为自己创建一个触摸识别器。 为您的集合视图禁用单元格选择,因为当用户触摸给定单元格时将调用这些委托。

class yourCell: UICollectionViewCell  
    
    var indexPath: IndexPath? = nil
    var collectionView: UICollectionView? = nil
    
    weak var delegate: yourDelegate? = nil
    
    override func awakeFromNib() 
        super.awakeFromNib()
        
        let selfTGR = UITapGestureRecognizer(target: self, action: #selector(self.didTouchSelf))
        self.contentView.addGestureRecognizer(selfTGR)
    
    
    @objc func didTouchSelf() 
        guard let collectionView = self.collectionView, let indexPath = self.indexPath else 
            return
        
        
        delegate?.didSelectCell(WithIndecPath: indexPath, InCollectionView: collectionView)
    
    
    func setupCell(WithIndexPath indexPath: IndexPath, CollectionView collectionView: UICollectionView, Delegate delegate: yourDelegate) 
        self.indexPath = indexPath
        self.collectionView = collectionView
        self.delegate = delegate
    
    

在您的 viewController 中,为此协议创建扩展,如果您做的一切正确,当用户触摸您的单元格时,单元格将通过此委托呼叫您。

extension YourViewController: yourDelegate 
    
    func didSelectCell(WithIndecPath indexPath: IndexPath, InCollectionView collectionView: UICollectionView) 
        //You have your index path and you can "if" your colllection view
        
        if collectionView == self.yourFirstCollectionView 
            
         else if collectionView == self.yourSecondCollectionView 
            
        
        //and so on..
    
    

由于协议是“:class”,我们可以为您的委托属性使用弱,这样就不会发生内存泄漏。我在整个项目中对 tableViews 和 collectionViews 使用这种方法。

【讨论】:

@VinceMohamed 我很高兴 :) 如果对您有帮助,请接受答案

以上是关于检测位于另一个 uicollectionview 内的 uicollectionView 的哪个 UICollectionViewCell 位于中心的主要内容,如果未能解决你的问题,请参考以下文章

从另一个单元格中检测单元格选择

UICollectionView 保持水平列表滚动位置

UICollectionView,单元格选择不起作用,单元格滚动正常

UISwitch 的 UICollectionview 点击事件

如何获取位于 UICollectionView 中心的单元格的 indexPath

将新数据插入核心数据存储时如何使 UICollectionView 始终位于底部