通过查看层次结构(Uiview内部的UIBUTTON)传播触摸事件



可以肯定的是,这很容易,在互联网上仍然找不到类似的东西 - 还有更多理由相信这是一个没有问题的原因。无论如何!

如何将UIButton放入UIView中,并在视图上添加UITapGestureRecognizer在此视图中调用函数,同时仍同时执行按钮操作?

我拥有的内容:

  • 在按钮内仅执行按钮操作。
  • 敲击按钮外仅执行视图函数。

我想要什么:

  • 在按钮内部敲击同时执行,按钮操作和视图功能。
  • 敲击按钮外仅执行视图函数。

更新(我使用的代码):

import UIKit
import AwesomeFramework
class View: UIView {
    let button = UIButton()
    let awesomeObject = AwesomeFramework.AwesomeObject()
    @objc func a(_ sender: Any) {
        // never gets called
        print("a")
    }
    init() {
        super.init(frame: .zero)
        button.translatesAutoresizingMaskIntoConstraints = false
        addSubview(button)
        NSLayoutConstraint.activate([
            button.centerXAnchor.constraint(equalTo: centerXAnchor),
            button.centerYAnchor.constraint(equalTo: centerYAnchor),
            button.widthAnchor.constraint(equalTo: widthAnchor),
            button.heightAnchor.constraint(equalTo: heightAnchor),
            ])
        button.addTarget(awesomeObject, action: #selector(awesomeAction), for: .touchUpInside) // awesomeAction prints "b"
        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(a(_:)))
        addGestureRecognizer(gestureRecognizer)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

点击我想要的按钮:

b
a

a
b

我得到:

b

更新:通过一些限制调整了示例,例如:

  • 按钮在框架中触发一个动作,我无法访问
  • 实际上有许多按钮和其他点击接收元素。我不想对所有这些函数进行A功能(我也不能因为某些要素管理自己的识别者)

一个按钮可以具有多个目标。告诉按钮以触发ab

button.addTarget(self, action: #selector(a), for: .touchUpInside)
button.addTarget(self, action: #selector(b), for: .touchUpInside)

如果用户将手指放在按钮中,然后在发布之前将其拖出按钮怎么办?如果您希望它也触发a操作,请执行此操作:

button.addTarget(self, action: #selector(a), for: .touchUpOutside)

在uitapgesturerecognizer的选择器内部,您可以检查哪个视图是从中触发的手势。而且,由于您可以访问视图,因此您可以检查发送视图的标签并识别它是否是由按钮触发的。

这就是您可以做到的:

@objc func a(_ sender: Any) {
    if let gesture = sender as? UITapGestureRecognizer, let v = gesture.view, v.tag == self.button.tag {
        return //since it has the tag same as that you had set for button, return
    }
    // else do what you wanted to.
}

您可以将选择器链接为:

#selector(a(_:))

定义为:

func a(_ sender: Any) { .....}

请确保通过:

标记您的按钮
self.button.tag = 9 //(or any number you prefer)

最新更新