GestureRecognizer 没有响应点击

Posted

技术标签:

【中文标题】GestureRecognizer 没有响应点击【英文标题】:GestureRecognizer not responding to tap 【发布时间】:2014-09-25 00:07:45 【问题描述】:

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

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

我创建了必要的关联函数:

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

点击相关视图时,“In handler 从未打印到控制台”。然后我删除了处理函数,看看编译器是否会抱怨缺少的函数。没有。

我真的很难过。我真的很感激人们能对此有所启发。

更新:我的班级实际上是UIImageView,而不是UIView

【问题讨论】:

试试self.view.addGestureRecognizer 我没有在Swift中尝试过,但这是我在Objective C中使用的。 我正在使用self.userInteractionEnabled 意味着这些代码sn-ps 实际上是在我感兴趣的我修改的视图中。因此,self.view 是不可能的!感谢您的贡献! 【参考方案1】:

我使用的是 UITapGestureRecognizer,我使用 Storyboard 放置在 UILabel 上。

为了让它工作,我还必须在情节提要的 UILabel 属性检查器中标记为“用户交互已启用”的块中放置一个复选标记。

【讨论】:

是的,就是这样 - 自从我上次构建应用程序以来,我忘记了这一点。当您附加手势识别器时,似乎应该自动执行一些操作。 你刚刚节省了我的 30 分钟。 我不明白为什么默认禁用用户交互。【参考方案2】:

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

其中一个父视图是在未提供 frame: 的情况下创建的

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

【讨论】:

我现在也遇到了同样的问题。您是什么意思,其中一个父视图是在没有提供框架的情况下创建的?你是怎么做到的? 我遇到了同样的问题。我有一个带有 UIScrollView 子视图的视图,它有一个 UIImageView 子视图。我没有为 UIImageView 指定框架,这会阻止按钮工作。谢谢! 有谁知道为什么这会导致手势识别器无法检测到触摸......? 我无法得到它。我可以在哪里为 UIImageView 添加这个frame: 与无框架问题类似,我只是让 UITapGestureRecognizer 无法工作,因为视图的框架高度对于内容来说太小了(即使所有内容都很好地显示在显示器中)。可能是一个边缘案例,但添加此评论以防它对某人有所帮助。【参考方案3】:

试试这个

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")

【讨论】:

谢谢,将 userInterActionEnabled 添加到我的 UIImageView 是我的解决方案。 将它放在 viewDidAppear 中并不好,因为您最终会添加大量手势 您可以在 viewDidAppear 中添加这些代码,然后在 viewDidDisappear 中删除手势识别器。这将解决添加到您的视图中的无限数量的手势识别器。【参考方案4】:

除了其他答案之外,这可能是由于将手势识别器添加到多个视图而导致的。手势识别器仅适用于单个视图。

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

【讨论】:

伟大的补充!【参考方案5】:

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

我的带有手势识别器的 UIView 具有 .isUserInteractionEnabled = true,但在我为其父视图设置 .isUserInteractionEnabled = true 之前它不会响应点击。

【讨论】:

我正在做程序化视图,这就是为我做的。 惊人的答案,谢谢,它解决了我的问题。【参考方案6】:

很可能您在错误的位置添加了UIGestureRecognizer。这是来自storyboardUIView 的工作示例。如果您动态创建UIView,那么您应该将此初始化放在正确的构造函数中。

class TestView: UIView

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

    func handleTap(gestureRecognizer: UITapGestureRecognizer)
    
        println("Here")
    

【讨论】:

【参考方案7】:

经过多次反复试验,我找到了解决此问题的方法。所以有两个解决方案二这个

1. 在 vi​​ewDidLoad() 中添加 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】:

此代码适用于 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
    

【讨论】:

【参考方案9】:

Xcode 11.4 Swift 5.2

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)

在你想收听NotificationUIViewController

override func viewDidLoad() 
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(myViewWasTapped), name: .DidTapMyView, object: nil)


@objc func myViewWasTapped() 
    // Notified here - do something

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

除了上述(userInteractionEnabledclipsToBounds 等)之外,如果您正在使用子视图控制器中的视图,请确保您已将其添加为带有 myParentViewController.addChild(myChildViewController) 的子视图——我们已经现在遇到了几种情况,可见视图没有触发识别手势,因为它们的视图控制器没有被添加,大概是 VC 本身没有被保留。

【讨论】:

感谢您发布此信息,我遇到了同样的问题并且很难调试。这帮助我找到了正确的位置!【参考方案12】:

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

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

【讨论】:

【参考方案13】:

事实证明,我的手势不起作用,因为它属于普通类,而不是 UIView 的子类或任何东西。

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

【讨论】:

【参考方案14】:

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

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

【讨论】:

【参考方案15】:

我在以编程方式创建的 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)

    

【讨论】:

我希望人们在投反对票时发表评论。看起来很奇怪,这对我有用。见***.com/questions/6010186/…

以上是关于GestureRecognizer 没有响应点击的主要内容,如果未能解决你的问题,请参考以下文章

用Swift GestureRecognizer 的几个注意点

GestureRecognizer 开始时如何以编程方式关闭 clipsToBounds 属性?

让flash完全透明化,不响应鼠标点击呢?

iPad 通知中心小部件无响应

UIWebview GestureRecognizer 用于显示工具栏

UIButton按钮点击无响应处理方法