带有点击手势识别器的 UILabel 不起作用

Posted

技术标签:

【中文标题】带有点击手势识别器的 UILabel 不起作用【英文标题】:UILabel with Tap Gesture Recognizer not working 【发布时间】:2016-08-26 09:59:05 【问题描述】:

我使用XIB 设计了一个UICollectionViewCell,在该自定义单元格中我有一个UILabel,我已启用其用户交互。

在我设计cell 时,在我的viewcontroller 中,这是我的代码。

UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)];
buyNowTapped.numberOfTapsRequired = 1.0;
cell.buy.tag = indexPath.row;
cell.buy.userInteractionEnabled = YES;
[cell.buy addGestureRecognizer:buyNowTapped];

-(void)buyNowClicked : (id)sender

  UIButton *button;
  UILabel *label;
  if([sender isKindOfClass:[UIButton class]])
  
      button = (UIButton *)sender;
      [self buyService:button.tag];
  
  else if ([sender isKindOfClass:[UILabel class]])
  
    label = (UILabel *)sender;
    [self buyService:label.tag];
  

但是添加的点击手势不起作用。

【问题讨论】:

显示buyNowClicked函数.. 检查buy标签视图层次结构,查看其他未阻止其userInteraction的视图 我已经添加了描述 启用用户交互 所以问题是buyNowClicked 永远不会被调用,不是吗?你能在里面放一个 NSLog 以确保它永远不会被调用吗? 【参考方案1】:

使用标签属性创建自定义单元格并使用

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    NSLog(@"%ld", (long)indexPath.row);

注意:在某处添加了 TapGestureRecognizer,它会阻止选择单元格 didselectitematindexpath

【讨论】:

【参考方案2】:

我的建议是重新设计您的设计并将UILabel 更改为UIButton,因为UIButton 仅处理点击识别,而且您也没有任何点击转发的问题也转发给UICollectionView (@确实会调用 987654325@)。

所以,用一个按钮更改标签,并在其上的TouchUpInside 事件中设置buyNowClicked: 方法。

更新:如果您因任何原因无法删除 UILabel,则在 UILabel 下放置一个 UIButton(相同的 frame 和最终 NSConstraints)并移动 @ 987654332@ 方法在按钮上的TouchUpInside 事件,然后您轻松获胜

【讨论】:

我知道这样比较好,但我有一定的设计限制要这样处理 @AvinashSharma,好的,然后在 UILabel 下放置一个 UIButton(具有相同的框架和最终约束)并在按钮上的 TouchUpInside 事件中移动 buyNowClicked: 方法,然后您轻松获胜:) 是的,这似乎是最简单的方法【参考方案3】:

    您必须将此代码添加到 Your Custom UICollectionViewCell 类中。

    然后创建一个响应点击的委托。

    在集合视图的cellForRowAtIndexPath 中分配该委托。

如果您需要详细解释,请告诉我。

编辑 1:代码:

MyCell.swift:

import UIKit

protocol MyCellDelegate 
    func lblNameTapped(cell: MyCell)


class MyCell: UICollectionViewCell 
    @IBOutlet var lblName: UILabel!
    var lblNameTapRec:UITapGestureRecognizer!
    var delegate: MyCellDelegate?

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code

        lblNameTapRec = UITapGestureRecognizer(target: self, action: #selector(MyCell.lblNameTapped(_:)))
        lblName.userInteractionEnabled = true
        lblName.addGestureRecognizer(lblNameTapRec)
    

    func lblNameTapped(sender: AnyObject)
        delegate?.lblNameTapped(self)
    


ViewController.Swift:

import UIKit

class WallOfPraizeVC: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate,MyCellDelegate 

    @IBOutlet var collectionView: UICollectionView!

    //DelegateMethod
    func lblNameTapped(cell: MyCell) 
        let indexPath = self.collectionView.indexPathForCell(cell)
        print(indexPath!.row)
    

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
    
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCell
        cell.delegate = self
        return cell
    

【讨论】:

但是我怎么知道标签标签 你想在用户按下标签时打开一些视图控制器吗? 我需要调用一个需要知道被点击的单元格索引的服务。 您之前是否在 Table 中实现过手势识别器和自定义委托? 给我一点时间。【参考方案4】:

试试这个:-

-(void)buyNowClicked:(UITapGestureRecognizer*)tap

    NSLog(@"buyNowClicked here");
    [self buyService:tap.view.tag];

 

【讨论】:

【参考方案5】:

将此代码用于点击手势:-

    UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)];
    buyNowTapped.numberOfTapsRequired = 1.0;
    cell.buy.tag = indexPath.row;
    cell.buy.userInteractionEnabled = YES;
    [cell.buy addGestureRecognizer:buyNowTapped];


    Try this :

    -(void)buyNowClicked : :(UITapGestureRecognizer*)recognizer
    

        UIView *view = [recognizer view];

        NSLog(@"tag %ld",(long)view.tag);

      UIButton *button;
      UILabel *label;

      if([view isKindOfClass:[UIButton class]])
      
          button = (UIButton *)sender;
          [self buyService:button.tag];
      
      else if ([view isKindOfClass:[UILabel class]])
      
        label = (UILabel *)sender;
        [self buyService:label.tag];
      
    

【讨论】:

以上是关于带有点击手势识别器的 UILabel 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

添加手势识别器 uivew 导航栏 swift 不起作用

Xamarin IOS UILabel在UIScrollView中点击手势不起作用

在 UIPageControl 旁边的 UILabel 上点击手势不起作用

在 ListView 中点击手势手势识别器不起作用

当基本字符串包含双引号时,仅针对 Swift 中 UILabel 的特定范围的点击手势不起作用

ios uiimageview点击手势在动画期间不起作用