[英]Propagating touch event through view hierarchy (UIButton inside UIView)
可以肯定的是,这是一件容易的事,但仍然无法在Internet上找到任何类似的东西–还有一个理由认为这不是问题。 无论如何!
如何在UIView
放置UIButton
并在视图上添加UITapGestureRecognizer
,以在此视图中调用函数,同时仍然执行按钮动作?
我有的:
我想要的是:
UPDATE(我使用的代码):
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
更新:对示例进行了一些限制,例如:
在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)
一个按钮可以有多个目标。 告诉按钮同时触发a
和b
:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.