强制触摸 UITableViewCell 内的 UICollectionView

Posted

技术标签:

【中文标题】强制触摸 UITableViewCell 内的 UICollectionView【英文标题】:Force touch on UICollectionView inside of UITableViewCell 【发布时间】:2017-01-06 04:30:05 【问题描述】:

我有一个带有 Tableview、多个 TableViewCells 的 viewController,并且在每个 TableViewCell 中,有一个带有多个 UICollectionViewItems 的 UICollectionView。每个 collectionView 项都有一个标签和图像视图。我正在尝试让 3d touch 工作,以便用户通过强制触摸 tableCell 的不包含集合视图的区域来查看和弹出,预览并弹出到一个视图控制器中,然后能够执行与 collectionView 中的一张图像相同,但预览并弹出到不同的视图控制器。我的第一个场景工作正常,当开始强制触摸和“窥视”时,tableCell 在屏幕上保持清晰。我坚持让它在集合视图中工作,无论我做什么,只有一个图像视图框架在第一个 tableview 行上保持清晰,无论我实际按下哪一行。代码如下:

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? 

    //get the tableviewCell
    if let tableCellPath = tableView.indexPathForRow(at: location) 
        print("tableCellPath=", tableCellPath)
        if let tableCell = tableView.cellForRow(at: tableCellPath) as? VenueMainTableViewCell 
            //user tapped on a beer in the collectionview
            if let collectionView = tableCell.collectionView 
                let collectionPoint = collectionView.convert(location, from: tableView)
                if let cvPath = collectionView.indexPathForItem(at: collectionPoint) 
                    let collectionViewCell = collectionView.cellForItem(at: cvPath) as? VenueMainCollectionViewCell

                    let cvFrame = collectionViewCell?.itemLabelImageView.frame

                    let bc = storyboard?.instantiateViewController(withIdentifier: "itemDetail") as! ItemDetailViewController
                    let ven = UTcheckin.sharedInstance.Venues[collectionView.tag]
                    let selectedItem = ven.ItemsAtVenue[(collectionViewCell?.tag)!]
                    bc.item = selectedItem

                    previewingContext.sourceRect = cvFrame!

                    return bc
                
            
        
        if let tablePath = tableView.indexPathForRow(at: location) 
            //user tapping on a venue, this works
            previewingContext.sourceRect = tableView.rectForRow(at: tablePath)
            let vc = storyboard?.instantiateViewController(withIdentifier: "venueDetail") as! VenueDetailViewController
            vc.venue = UTcheckin.sharedInstance.Venues[tablePath.row]

            return vc
        
        return nil
    
    return nil

似乎我需要获取集合视图项目图像视图的矩形,但由于它位于表格单元格中,我该如何访问它?在此先感谢您的任何指点。

【问题讨论】:

当您对UITableView 的最后一行中的集合视图执行此操作时,您的 cvFrame 值是多少? @Rikh 我的 cvFrame 值是相同的,无论我点击哪个 collectionView 单元格,也不管它位于哪一行:cvFrame: (0.0, 0.0, 60.0, 60.0)。 60x60 是 collectionView 单元格中 imageView 的大小,在 0,0 处,保持清晰的框是屏幕的左上角。我的尺寸正确,只需要在 tableviewCell 中获取 collectionView 单元格的 x、y 值(如果有意义的话)。 【参考方案1】:

我认为解决方案与UITableView 相同。您必须使用registerForPreviewingWithDelegate 方法注册每个单元格以进行预览。你应该注册它 cellForRow 方法。

这应该对你很有帮助。特别是The Solution段:


      How to Peek & Pop A Specific View Inside a UITableViewCell

【讨论】:

以上是关于强制触摸 UITableViewCell 内的 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

检测 UITableViewCell 子视图内的触摸

将 UITapGestureRecognizer 触摸传递到底层 UITableViewCell

UITableViewCell 内的 UIButton 没有收到点击?

将 UITableViewCell 内的 UITextField 保存到 NSMutableArray

UITableViewCell 内的 UIScrollView - 水平滚动

以编程方式“触摸”UITableViewCell?