繁体   English   中英

用户点击屏幕任意位置时的通话功能

[英]Calling function when user taps anywhere on screen

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

菜单:

我想关闭此菜单。

您也可以应用此简单方法

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


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

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

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

希望这可以帮助!

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

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

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

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的回答进行操作

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

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

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是否更有保障。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM