当用户点击屏幕上的任意位置时调用函数

Posted

技术标签:

【中文标题】当用户点击屏幕上的任意位置时调用函数【英文标题】:Calling function when user taps anywhere on screen 【发布时间】:2017-08-11 07:44:08 【问题描述】:

在我的应用程序中,我制作了一个小菜单,基本上是一个带有两个按钮的 UIView。当用户点击一个按钮时菜单打开,当用户点击同一个按钮时菜单也关闭。我希望当用户点击菜单 UIView 之外的任何位置时关闭菜单。

菜单:

【问题讨论】:

为您的视图添加手势, 您可以在菜单后面添加一个透明的覆盖层,在该覆盖层上您可以添加一个轻击手势识别器并在其选择器功能中关闭菜单 在视图中添加点击手势比其他任何方法都好。 【参考方案1】:

你也可以用这个简单的方法

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(_:)))
    self.view.addGestureRecognizer(tapGesture)


        func tapBlurButton(_ sender: UITapGestureRecognizer) 
            if //checkmenuopen
            
                closemenuhere
            
        

【讨论】:

【参考方案2】:

为此,当您显示小菜单时,请在其下方添加一个不可见的按钮 (UIColor.clear),并将整个屏幕作为框架。它的作用是关闭你的菜单。

确保在关闭小菜单时也关闭按钮。

希望这会有所帮助!

【讨论】:

很高兴它有帮助! :D【参考方案3】:

您可以使用基本的触摸开始功能

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    print("TAPPED SOMEWHERE ON VIEW")

【讨论】:

【参考方案4】:

您的情况有几种解决方案:

1- 在 ViewController 中实现 touchesBegan(_:with:) 方法:

告诉这个对象一个或多个新的触摸发生在一个视图中,或者 窗口。

简单来说,如下:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    // do something

2- 将UITapGestureRecognizer 添加到 ViewController 的主视图中:

override func viewDidLoad() 
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(doSomething(_:)))
    view.addGestureRecognizer(tapGesture)


func doSomething(_ sender: UITapGestureRecognizer) 
    print("do something")

或者-当然-您可以在没有参数的情况下实现选择器:

override func viewDidLoad() 
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(doSomething))
    view.addGestureRecognizer(tapGesture)


func doSomething() 
    print("do something")

3-你也可以关注Mohammad Bashir Sidani's answer。

我建议确保为您的按钮添加适当的约束,无论它是通过编程方式还是通过情节提要添加的。

【讨论】:

所以故事是,起初我确实添加了 touchesBegan() 方法,但由于某种原因它没有执行。所以这就是我在 *** 上问你们的原因。 我明白了,我建议在问题中提及它。不管怎样,好在问题已经解决了:)【参考方案5】:

我不确定下面的代码是否适用于您的情况,只是一个建议。

class ViewController: UIViewController 

  var closeMenuGesture: UITapGestureRecognizer!

  override func viewDidLoad() 
    super.viewDidLoad()

    closeMenuGesture = UITapGestureRecognizer(target: self, action: #selector(closeMenu))
    closeMenuGesture.delegate = self

    // or closeMenuGesture.isEnable = false
  

  @IBAction func openMenu() 
    view.addGestureRecognizer(closeMenuGesture)
    // or closeMenuGesture.isEnabled = true
  

  @IBAction func closeMenu() 
    view.removeGestureRecognizer(closeMenuGesture)
    // or closeMenuGesture.isEnabled = false
  



extension ViewController: UIGestureRecognizerDelegate 
  func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool 
    return touch.view === self.view // only valid outside menu UIView
  

我从来没有遇到过这种情况,所以不确定启用/禁用 closeMenuGesture 是否足以确保其他控件正常工作,或者添加/删除 closeMenuGesture 是否更有保障。

【讨论】:

以上是关于当用户点击屏幕上的任意位置时调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 屏幕上的任意位置点击时关闭工具提示

在我点击屏幕上的任意位置之前,Firebase 登录承诺不会解决

屏幕解锁时调用函数

当应用程序处于活动状态时,iOS 处理推送通知点击

Flex3 中数据网格上的关键事件

在通知点击事件时调用活动