代码之家  ›  专栏  ›  技术社区  ›  Tom A

将GestureRecognizer添加到UIView不会触发操作

  •  2
  • Tom A  · 技术社区  · 8 年前

    我不知道为什么这个手势识别器不能正常工作:

    class SlideInMenuLauncher: NSObject, UITableViewDelegate, UITableViewDataSource {
    
      fileprivate let dimmerView = UIView()
      fileprivate let tableView: UITableView = {
        let tbv = UITableView(frame: .zero)
        return tbv
      }()
      fileprivate let resourceArray: [Content]
      weak var delegate: SlideInMenuDelegate?
    
      let cellIdentifier = "SlideInMenuTableViewCell"
    
      init(withContentArray contentArray: [Content]) {
    
        resourceArray = contentArray
    
        super.init()
    
        tableView.dataSource = self
        tableView.delegate = self
    
        tableView.register(UINib(nibName: cellIdentifier, bundle: nil), forCellReuseIdentifier: cellIdentifier)
      }
    
      func showMenu() {
        if let window = UIApplication.shared.keyWindow {
          dimmerView.backgroundColor = UIColor(white: 0, alpha: 0.5)
    
          dimmerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissMenu)))
          dimmerView.isUserInteractionEnabled = true
    
          window.addSubview(dimmerView)
          window.addSubview(tableView)
    
          let height: CGFloat = 200
          let y = window.frame.height - height
          tableView.frame = CGRect(x: 0, y: window.frame.height, width: window.frame.width, height: height)
    
          dimmerView.frame = window.frame
          dimmerView.alpha = 0
    
          UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
            self.dimmerView.alpha = 1
            self.tableView.frame = CGRect(x: 0, y: y, width: self.tableView.frame.width, height: self.tableView.frame.height)
          }, completion: nil)
    
        }
      }
    
      func dismissMenu() {
        UIView.animate(withDuration: 0.5) {
          self.dimmerView.alpha = 0
    
          if let window = UIApplication.shared.keyWindow {
            self.tableView.frame = CGRect(x: 0, y: window.frame.height, width: self.tableView.frame.width, height: self.tableView.frame.height)
          }
        }
      }
    

    我在dismissMenu函数中放置了一个断点,但它从未被触发。也许我疲惫的眼睛(和思想)错过了一些简单的东西?

    ///Some other VC
    let slideInMenuLauncher = SlideInMenuLauncher(withContentArray: [content])
    slideInMenuLauncher.showMenu()
    
    5 回复  |  直到 7 年前
        1
  •  1
  •   Duncan C    8 年前

    我希望这会导致编译器错误。你错过了 @objc 关于你的声明 dismissMenu()

    编辑:

    下面是我创建的测试项目的代码:

    import UIKit
    
    class ViewController: UIViewController {
        @IBOutlet weak var tapView: UIView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            tapView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
            tapView.isUserInteractionEnabled = true
        }
    
        @objc func handleTap() {
            print("You tapped on the view")
        }
    }
    
        2
  •  0
  •   Enrico Susatyo    8 年前

    你能试着代替这个吗

    window.addSubview(dimmerView)
    window.addSubview(tableView)
    

    执行以下操作:

    window.addSubview(dimmerView)
    window.addSubview(tableView)
    window.bringSubviewToFront(dimmerView)
    
        3
  •  0
  •   Steven Gardner    8 年前

    let tapGes = UITapGestureRecognizer(target: self, action:#selector(dismissMenu))
        tapGes.delegate = self
        dimmerView.addGestureRecognizer(tapGes)
    

    希望对你有帮助!

        4
  •  0
  •   Caleb    8 年前

    我想你的问题是:

    dimmerView.alpha = 0

    alpha 设置为 0 0.5 只是想看看它是否有效,然后拨回一个更小的值,这个值仍然大于 0个 .

        5
  •  0
  •   Tom A    7 年前

    所以我发现了问题多亏了这个 post

    将对象设置为强属性修复了此问题。