【问题标题】:UIGesturerecognizer is not working on UIViewUIGesturerecognizer 不适用于 UIView
【发布时间】:2019-10-16 22:46:40
【问题描述】:

当我点击 UIView 但手势不起作用时。

override func viewDidLoad() {
        super.viewDidLoad()

        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        viewForSHadow.isUserInteractionEnabled = true
        viewForSHadow.addGestureRecognizer(tap)

        // Do any additional setup after loading the view.
    }


func handleTap(_sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
        viewForSHadow.isHidden = true
        viewForAlert.isHidden = true
    }

我只想在 UIView 点击时执行此操作。

【问题讨论】:

  • 你按了多少次手势
  • 你在视图顶部有 UIImageCiew 还是可以消耗手势的东西?
  • 您在哪里添加了 viewForSHdow,您添加了哪些约束?
  • 它在主视图中并显示 - 隐藏它。
  • 一旦您点击,您的视图将隐藏它在您的代码中的外观。所以你的水龙头只在第一次工作

标签: ios swift uiview uigesturerecognizer


【解决方案1】:

你必须使用 UIGestureRecognizerDelegate

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDismiss))
        tapRecognizer.delegate = self
        blackView.addGestureRecognizer(tapRecognizer)

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return true
}

@objc func handleDismiss() {
        print("handleDismiss")
}

Reference

不要忘记在你的类中设置 UIGestureRecognizerDelegate

【讨论】:

    【解决方案2】:

    首先,您的代码无法编译。 handleTap(_:) 签名必须是这样的:

    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
    }
    

    其次,您需要先尝试在单独的项目中使用最少的代码。我所说的最少代码是指您在问题中添加的内容。

    class ViewController: UIViewController {
        @IBOutlet weak var viewForSHadow: UIView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
            viewForSHadow.addGestureRecognizer(tap)
        }
    
        @objc func handleTap(_ sender: UITapGestureRecognizer) {
            print("---------View Tapped--------")
        }
    }
    

    试试上面的代码,看看你能不能让它工作。上面的代码在我没有任何delegate 或numberOfTaps 的情况下运行良好。

    【讨论】:

      【解决方案3】:

      如果有 alpha = 0 的任何内容与您的 viewForSHdow 重叠,您可以检查 调试视图层次结构。

      【讨论】:

        【解决方案4】:

        您需要提及UITapGestureRecognizer 的numberOfTapsRequired 属性。

        override func viewDidLoad() {
            super.viewDidLoad()
            let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(_sender:)))
            tap.numberOfTapsRequired = 1
            viewForSHadow.isUserInteractionEnabled = true
            viewForSHadow.addGestureRecognizer(tap)
        }
        
        @objc func handleTapGesture(_sender: UITapGestureRecognizer) {
            print("---------View Tapped--------")
            // Why are you hiding this view **viewForSHadow**
            viewForSHadow.isHidden = true
            viewForAlert.isHidden = true
        }
        

        另外,请确保您没有在代码中的任何位置使用viewForSHadow.isUserInteractionEnabled = false。

        【讨论】:

        【解决方案5】:

        您的代码足以让 UIGestureRecognizer 正常工作,您应该检查其他一些东西,例如,是否有其他东西可以消耗用户交互。并且还要检查你是否使用

        isUserInteractionEnabled = false

        到 viewForSHAdow 的一些父视图。

        【讨论】:

          【解决方案6】:

          你必须实现如下:

              class ViewController: UIViewController, UIGestureRecognizerDelegate {
          
          ...
          
              override func viewDidLoad() {
                  super.viewDidLoad()
                  let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_sender:)))
                  viewForSHadow.isUserInteractionEnabled = true
                  viewForSHadow.addGestureRecognizer(tap)
              }
          
              @objc func handleTap(_sender: UITapGestureRecognizer) {
                  print("---------View Tapped--------")
                  viewForSHadow.isHidden = true
                  viewForAlert.isHidden = true
              }
          ...
          
          }
          

          【讨论】:

          • 这里delegate 有什么用,你看到代码了吗?一旦你按下手势用户隐藏viewForSHadow.isHidden = true
          • 这里根本不需要代理!
          • 是的,不需要委托。 @Anbu.Karthik 我刚刚使用了 Coding 的代码来使点击手势起作用。
          • @BhavikModi - 但如果用户点击视图,他会隐藏自己的视图
          • @Anbu.Karthik 我们不知道 Coding 到底想要什么 :) 你可以直接问他。
          猜你喜欢
          • 2011-02-23
          • 1970-01-01
          • 2017-03-19
          • 2013-09-21
          • 1970-01-01
          • 1970-01-01
          • 2021-05-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多