GestureRecognizer没有响应tap

时间:2014-09-25 00:07:45

标签: ios swift uigesturerecognizer

UIImageView的子类初始化之后,我有以下代码行:

self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))

我创建了必要的相关功能:

func handleTap(gestureRecognizer: UITapGestureRecognizer) {
    print("In handler")
}

在点击有问题的视图时,"在处理程序中从未打印到控制台"。然后我删除了处理函数,看看编译器是否会抱怨丢失的函数。它没有。

我很难过。我真的很感激任何光明人都可以放弃这一点。

更新:我的课程实际上是UIImageView而不是UIView

15 个答案:

答案 0 :(得分:111)

我正在使用UITapGestureRecognizer使用Storyboard放置UILabel

为了实现这一点,我还必须在故事板的UILabel属性检查器中标记为“已启用用户交互”的块中打勾。

enter image description here

答案 1 :(得分:14)

试试这个

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.view.userInteractionEnabled = true
    var tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    self.view.addGestureRecognizer(tapGesture)
}

func handleTap(sender : UIView) {
    println("Tap Gesture recognized")
}

答案 2 :(得分:13)

在仔细梳理我的代码后,我发现了答案。

其中一个父视图是在未提供frame:

的情况下创建的

虽然这是一个足够错误的错误以保证删除这些问题,但是其他人在将来也会遇到同样的问题......

答案 3 :(得分:7)

您最有可能在错误的地方添加UIGestureRecognizer。以下是来自UIView的{​​{1}}的工作示例。如果您动态创建storyboard,则应将此初始化置于正确的构造函数中。

UIView

答案 4 :(得分:6)

除了其他答案之外,这可以通过将手势识别器添加到多个视图来引起。手势识别器仅适用于单一视图。

参考:https://stackoverflow.com/a/5567684/6543020

答案 5 :(得分:4)

我在程序化视图中遇到了这个问题。

我的带有手势识别器的UIView的值为.isUserInteractionEnabled = true,但是直到我为其父级视图也将.isUserInteractionEnabled = true设置为真时,它才对点击做出响应。

答案 6 :(得分:1)

此代码适用于XCode 7.0.1

import UIKit

class ImageView: UIImageView {

    init(frame: CGRect, sender: Bool, myImage: UIImage) {
        super.init(frame: frame)
        self.image = myImage
        initBorderStyle(sender)

        // enable user interaction on image.
        self.userInteractionEnabled = true
        let gesture = UITapGestureRecognizer(target: self, action: "previewImage:")
        addGestureRecognizer(gesture)

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func previewImage(myGesture: UITapGestureRecognizer? = nil) {
        print("i'm clicked")
    }

    private func initBorderStyle(sender: Bool) {
        self.layer.masksToBounds = true
        self.layer.cornerRadius = 8
        self.layer.borderWidth = 0.5
        self.layer.borderColor = getBorderColor(sender)
        self.backgroundColor = getColor(sender)
    }


    func getBorderColor(sender: Bool) -> CGColor {
        var result: CGColor
        if sender {
            result = UIColor(red: 0.374, green: 0.78125, blue: 0.0234375, alpha: 0.5).CGColor
        } else {
            result = UIColor(red: 0.3125, green: 0.6015625, blue: 0.828125, alpha: 0.5).CGColor
        }
        return result
    }
}

答案 7 :(得分:1)

经过大量的试验和错误,我找到了解决这个问题的方法。所以有两个解决方案,这个

1。在viewDidLoad()中添加GestureRecognizer然后转    userInteractionEnabled = true

2。如果使用计算属性,请使用lazy var代替let

lazy var profileImageView: UIImageView = {
    let iv = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    iv.image = #imageLiteral(resourceName: "gameofthrones_splash")
    iv.contentMode = .scaleAspectFill
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
    iv.isUserInteractionEnabled = true
    return iv
}()

答案 8 :(得分:1)

此外,以上(userInteractionEnabledclipsToBounds等)如果在子视图控制器中使用视图,请确保已将其添加为{{1 }} —现在,我们遇到了两种情况,其中可见视图由于未添加视图控制器而无法触发识别手势,并且大概还没有保留VC。

答案 9 :(得分:1)

Xcode 11.4 Swift 5.2

默认情况下,在自定义Prelude> data A' = A' { getA :: Int } Prelude> (37 :: Int) :: A' <interactive>:12:2: error: • Couldn't match expected type ‘A'’ with actual type ‘Int’ • In the expression: (37 :: Int) :: A' In an equation for ‘it’: it = (37 :: Int) :: A' 上启用了

UserInteraction

UIView

如果您想在其他地方收到自定义import UIKit class YourView: UIView { override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder: NSCoder) { super.init(coder: coder) commonInit() } func commonInit() { let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapped)) self.addGestureRecognizer(tapGesture) } @objc func tapped() { // do something } } 被窃听的通知,那么使用UIView会很方便。

最好将其创建为扩展名,以防止被字符串键入。

Notification

在自定义extension Notification.Name { static let DidTapMyView = Notification.Name("DidTapMyView") } 中,当点击的UIView被称为

function

在您的@objc func tapped() { NotificationCenter.default.post(name: .DidTapMyView, object: self) } 中要收听UIViewController的地方:

Notification

答案 10 :(得分:1)

对于即使使用之前的所有答案仍然有问题的任何人,请确保您使用的是 UITapGestureRecognizer 而不是 UIGestureRecognizer,我一直在试图找出问题所在时遗漏了这个细节。

答案 11 :(得分:0)

原来,我的手势不起作用,因为它属于普通类,而不是UIView的子类。

我通过创建一个UIView的子类来解决该问题,该子类在该普通类中有一个实例,并将手势逻辑放入其中。

答案 12 :(得分:0)

我通过将高度设置为UIView解决了我的问题。

optionView.heightAnchor.constraint(equalToConstant: 18).isActive = true

答案 13 :(得分:0)

这是我在 2021 年的发现列表,XCode 13:

  • 确保您的视图及其所有超级视图都设置了宽度和高度约束(这一点至关重要)
  • 为您的视图设置 isUserInteractionEnabled = true
  • 无需为其他超级视图设置显式框架或 isUserInteractionEnabled

答案 14 :(得分:-1)

我在以编程方式创建的 ViewController 中遇到了同样的问题。当我向视图添加背景颜色时,该错误已修复。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .systemBackground
        
        let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing))

        view.addGestureRecognizer(tap)

    }
}