可以肯定的是,这很容易,在互联网上仍然找不到类似的东西 - 还有更多理由相信这是一个没有问题的原因。无论如何!
如何将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功能(我也不能因为某些要素管理自己的识别者)
一个按钮可以具有多个目标。告诉按钮以触发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)
在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)