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

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

菜单:

【问题讨论】:

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

标签: ios iphone swift 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() 方法,但由于某种原因它没有执行。所以这就是我在 StackOverflow 上问你们的原因。
      • 我明白了,我建议在问题中提及它。不管怎样,好在问题已经解决了:)
      【解决方案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 是否更有保障。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2022-06-22
        • 2020-10-05
        • 1970-01-01
        相关资源
        最近更新 更多