点击手势事件在 UIView 上不起作用

Posted

技术标签:

【中文标题】点击手势事件在 UIView 上不起作用【英文标题】:Tap gesture event not working on UIView 【发布时间】:2017-09-15 04:25:05 【问题描述】:

我正在尝试向 UIView 添加轻击手势,但该手势未被识别。

"iconBadgeView" 是一个 UIView,其图像的大小已在参数中传递。

lazy var cardioVascularIcon : IconBadgeView! = 

    let iconBadgeView = IconBadgeView(frame: CGRect(x: 0, y: 0, width: 95, height: 95), data:["big":"db_history"])

    let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:)))

    tapEvent.numberOfTapsRequired = 1
    iconBadgeView.translatesAutoresizingMaskIntoConstraints = false

    iconBadgeView.isUserInteractionEnabled = true       
    iconBadgeView.addGestureRecognizer(tapEvent)
()

有一个委托器附加到同一个类,函数实现如下:

func loadNewView(sender: UITapGestureRecognizer)  
    print("Tapped")

函数 loadNewView 没有被调用。我不确定代码中有什么问题。如果有人可以提供帮助,请。

我将 iconBadgeView 添加到 superview 如下:

override init(frame: CGRect) 
    super.init(frame: CGRect.zero)

    addSubview(cardioVascularIcon)

    cardioVascularIcon.pinToSuperview([.Top])
    cardioVascularIcon.pinToSuperview([.Left], constant: 92)
    cardioVascularIcon.pinToSuperview([.Right], constant: 92)

【问题讨论】:

let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) tapEvent.addTarget(iconBadgeView, action: #selector(loadNewView(sender:))) 你为什么要在这里重复自己,我的朋友哈哈。如果您要创建一个带有default constructor 意思是UITapGestureRecognizer() 的手势,那么您需要将您的选择器提供给该方法addTarget,但是由于您使用的是带有选择器和目标的自定义构造函数,因此需要拥有它第二行代码:) 我试过删除重复的行,但没有帮助 您是否遇到任何错误/问题?只是出于好奇,您是否将 iconBadgeView 添加到您的 superView 中?另外,由于您禁用了translatesAutoresizingMaskIntoConstraints,请确保您将这些约束添加到它,如果现在您可能认为您在屏幕上查看并且它不是:) 不,我没有收到任何错误。我已经使用 addsubView 逻辑更新了问题。 让 tapGesture : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.recognizeTap(sender:)))。尝试使用这条线 【参考方案1】:

您的 iconBadgeView 消失了,因为它是局部变量。

您必须初始化 heartVascularIcon var。

lazy var cardioVascularIcon : IconBadgeView! = 

  cardioVascularIcon.frame = CGRect(x: 0, y: 0, width: 95, height: 95)
  //here call function which sets data property

  let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:)))

  tapEvent.numberOfTapsRequired = 1
  cardioVascularIcon.translatesAutoresizingMaskIntoConstraints = false

  cardioVascularIcon.isUserInteractionEnabled = true       
  cardioVascularIcon.addGestureRecognizer(tapEvent)
()

【讨论】:

您好,感谢您的回答,但恐怕它没有用。 这是屏幕上可见的视图?缺少将此新视图添加到视图层次结构的代码。 是的,视图在屏幕上可见。【参考方案2】:

我找到了解决此问题的方法。我使用了按钮而不是标签,现在一切正常。以下是我正在使用的代码:

func createButton (buttonWidth : CGFloat?, buttonTitle : String?, buttonFont : UIFont?, imageName : String?, buttonColor : UIColor?) -> UIButton 
    let newButton = UIButton(type: . custom)
    newButton.showsTouchWhenHighlighted = false
    newButton.translatesAutoresizingMaskIntoConstraints = false
    newButton.adjustsImageWhenHighlighted = false

    if let title = buttonTitle 
        newButton.setTitle(title, for: .normal)
    
    if let color = buttonColor 
        if let _ = newButton.titleLabel 
            newButton.setTitleColor(color, for: .normal)
        
    

    if let btnWidth = buttonWidth 
        newButton.frame = CGRect(x: 0, y: 0, width: btnWidth, height: btnWidth)
        newButton.layer.cornerRadius = 0.5 * newButton.bounds.size.width
        newButton.clipsToBounds = true
    
    if let img = imageName 
        newButton.setImage(UIImage(named: img), for: .normal)
    
    if let font = buttonFont 
        newButton.titleLabel?.font = font
    

    return newButton

let addDiagButton = self.createButton(buttonWidth: nil, buttonTitle: addButtonTitle, buttonFont: UIFont.regularDisplayOfSize(30), imageName: nil, buttonColor: UIColor(red: 111, green: 160, blue: 186))

addDiagButton.addTarget(self, action: #selector(addDiag(sender:)), for: .touchUpInside)

上面的代码有一个通用的函数,它创建一个按钮并附加触发事件。代码运行良好。

为了让它表现得像一个标签点击,我在 createButton 函数中添加了一行。

newButton.adjustsImageWhenHighlighted = false

这将限制单击时按钮的闪烁效果。

【讨论】:

以上是关于点击手势事件在 UIView 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UIPanGesture 正在工作,但 UITapGesture 在 UIView 上不起作用

UiButton 点击​​在 UIView 上不起作用

滑动手势识别器在垂直方向上不起作用

Swift:UIView.insertSubview( , aboweSubview) 在 iOS 8 上不起作用

点击事件在 iPhone 4s 上不起作用

点击手势对我不起作用