【问题标题】:Swift: addGestureRecognizer not work for stackview childrenSwift:addGestureRecognizer 不适用于 stackview 孩子
【发布时间】:2018-05-29 07:31:26
【问题描述】:

代码:

for ... {
   let view = CategoryClass.createMyClassView()
   view.myLabel.text = packTitle
   view.twoLabel.text = packText
   view.bgCaategory.layer.cornerRadius = 30

   i = i + 1
   if(i == 1){
      selectPackId = packId!;
      view.imgSelect.image = UIImage(named: "selected")
   } else {
      view.imgSelect.image = UIImage(named: "select")
   }

   view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSendData(sender:))))

   self.stackView.addArrangedSubview(view)
}

@objc func handleSendData(sender: UITapGestureRecognizer) {
   print("H 1")
}

如果我点击查看,什么都不会打印“H 1”

如果我点击视图,我想要获取 id 或其他视图值

【问题讨论】:

  • 尝试为你的 UIView 设置一个框架:view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
  • @AnthonyR 不适合我

标签: swift uitapgesturerecognizer stackview


【解决方案1】:

如果按照 Marcel 的建议添加 isUserInteractionEnabled 仍然不起作用,还要确保层次结构中的每个父视图都有一个有效的框架(您可以在 Debug View Hierarchy 中检查它)。

例如我碰巧将 UIStackView 添加到父 UIView 但布局约束不正确,所以我最终将父 UIView 帧大小设为 0(但 UIStackView 仍然可见)。

【讨论】:

  • 谢谢。对我帮助很大。
【解决方案2】:

如果在界面生成器中创建 UIStackView,isUserInteractionEnabled 属性默认为 false。这意味着视图及其所有子视图不会响应用户交互。

当您在代码中创建视图时,此属性默认为true

添加:

stackView.isUserInteractionEnabled = true

您只需添加一次,例如在您的viewDidLoad 中。

【讨论】:

    【解决方案3】:

    它不起作用的原因可能是错误的方法签名。识别器操作的正确签名是这样的:

    recognizerAction(_ recognizer: UIGestureRecognizer)
    

    【讨论】:

    • 你能解释更多吗?
    • 使用 @objc func handleSendData(sender: UITapGestureRecognizer) 代替 @objc func handleSendData(_ sender: UITapGestureRecognizer) 并将调用更改为 #selector(handleSendData(_:))。不过,不确定它是否能解决您的问题,但至少这是手势识别器所期望的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-02-01
    • 2017-10-29
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多