UICollectionView 标头上的 UITapGestureRecognizer 不起作用?

Posted

技术标签:

【中文标题】UICollectionView 标头上的 UITapGestureRecognizer 不起作用?【英文标题】:UITapGestureRecognizer on UICollectionView header not working? 【发布时间】:2016-12-21 23:07:16 【问题描述】:

我正在尝试在我的 UICollection 视图的标题中添加一个点击手势识别器,但无论如何,我都无法启动 numberOfPostsViewTapped() 函数。我已经尝试了几个小时,并尝试在标题视图中使用其他 UI 元素,例如其他视图或标签,但没有任何帮助。一些指导将不胜感激。

 func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView 

    switch kind 

    case UICollectionElementKindSectionHeader: // only checking header - no footer on this view

        // use an external class for the header UICollectionViewCell in order to set outlets on a non-reusable cell
        // if you try to set outlets on a reusable cell, such as a header, it will fail
        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Header", forIndexPath: indexPath) as! ProfileCollectionViewHeader

        // dynamically set user profile information
        headerView.usernameTextLabel.text = user?.name
        headerView.numberOfPostsTextLabel.text = user?.numberOfPosts != nil ? "\(user!.numberOfPosts!)" : "0"

        let numberOfPostsViewSelector : Selector = #selector(self.numberOfPostsViewTapped)
        let viewPostsViewGesture = UITapGestureRecognizer(target: self, action: numberOfPostsViewSelector)
        viewPostsViewGesture.numberOfTapsRequired = 1
        viewPostsViewGesture.delaysTouchesBegan = true
        headerView.numberOfPostsTextLabel.userInteractionEnabled = true;
        headerView.numberOfPostsTextLabel.addGestureRecognizer(viewPostsViewGesture)

        return headerView

    default:

        assert(false, "Unexpected element kind")

    

func numberOfPostsViewTapped(sender: UITapGestureRecognizer)
    print("HErE")

【问题讨论】:

表达式#selector(self.numberOfPostsViewTapped) 甚至可以编译吗?查看您的代码,正确的选择器应该是#selector(self.numberOfPostsViewTapped(sender:)) 我确实编译...我用你的行替换并得到错误ProfileViewController.swift:117:66: Value of type 'ProfileViewController' has no member 'numberOfPostsViewTapped(sender:)' 【参考方案1】:

检查您的框架。你的 UICollectionView 在它的框架内吗?

如果一个视图超出了它的框架,并且没有剪裁到它的边界,它将显示视图的内容,尽管用户交互将无法使用它。

【讨论】:

我如何检查它是否在它的框架内?它显示正确link 检查它的最简单方法可能是将帧记录在 UICollectionView 的 layoutSubviews 之类的地方,例如 NSLog(@"Frame: %@", NSStringFromCGRect(self.frame)); (Objective-C 语法,我不知道 Swift 语法,抱歉,我相信你知道我的意思) 我添加了这条评论: override func viewDidLayoutSubviews() print("LAYING OUT SUBVIEWS") print("Frame: %@", NSStringFromCGRect(collectionView.frame)); 这就是打印的内容:LAYING OUT SUBVIEWS Frame: %@ 0, 64, 414, 607 我不确定这对我的问题意味着什么? 好的,在这种情况下,我回答的可能不是您的问题。我知道,当视图的内容超出其父视图的框架时,即使视图的内容仍然显示,它们也无法与之交互,因为它们位于该父视图框架之外。这就是我认为可能是你的问题。【参考方案2】:

我认为你需要将 userInteractionEnabled 设置为 true 到你的 headerView 以便点击会到达你的标签,它是你的 headerView 的子标签。

headerView.userInteractionEnabled = true

【讨论】:

我添加了,但似乎没有任何效果。我什至不确定如何开始调试这个问题【参考方案3】:

对您的代码进行了一些更改,这对我有用

 func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 
        
        switch kind 
        case UICollectionView.elementKindSectionHeader:
            guard
                let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "AddLinksReusableView", for: indexPath) as? AddLinksReusableView else 
                fatalError("Invalid view type")
            
            let numberOfPostsViewSelector : Selector = #selector(self.imgVuTapped)
            let viewPostsViewGesture = UITapGestureRecognizer(target: self, action: numberOfPostsViewSelector)
            headerView.profileImg.isUserInteractionEnabled = true

            viewPostsViewGesture.numberOfTapsRequired = 1
            viewPostsViewGesture.delaysTouchesBegan = true
            headerView.profileImg.addGestureRecognizer(viewPostsViewGesture)
            return headerView
        default:
            assert(false, "Invalid element type")
        
    
    @objc func imgVuTapped (sender: UITapGestureRecognizer)
        print("HErE, Its working")
    

快乐编码

【讨论】:

以上是关于UICollectionView 标头上的 UITapGestureRecognizer 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 标头未显示

无法使 UICollectionView 标头工作

Swift UICollectionView 标头未正确显示

在 UICollectionView 中使用 reloadData 时如何从重新加载中排除标头

UICollectionView 标头重复每一行

向浮动 UICollectionView 标头添加阴影