我想在我的一个视图中添加一个手势识别器来检测水龙头, 这是我的代码:
class DateTimeContainer: UIView, UIGestureRecognizerDelegate {
override func awakeFromNib() {
let gesture = UITapGestureRecognizer(target: self, action: #selector(self.onTap))
gesture.delegate = self
self.addGestureRecognizer(gesture)
}
func onTap(_ gestureRecognizer: UITapGestureRecognizer) {
openDatePicker()
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if touch.view?.tag != self.datePickerTag && !self.isDatePickerOpen() {
return true
}
return false
}
}
当我点击我的视图时,代码进入gestureRecognizer shouldReceive
方法并输入返回true的条件。
但onTap
方法永远不会被调用,有人可以告诉我为什么吗?
修改
添加self.isUserInteractionEnabled = true
我设法让它运转起来。
但它有一个奇怪的行为:就像它只在主视图中接收到了水龙头而不是在子视图中。
所以为了简单起见,我通过在视图中添加一个按钮并使用:
self.button?.addTarget(self, action: #selector(onTap), for: .touchUpInside)
答案 0 :(得分:4)
您可能忘了这样做:
self.isUserInteractionEnabled = true
此外,通常UIViewController子类通常是目标,并包含用于点击手势的方法。
您无需为点击手势设置代理(通常)
答案 1 :(得分:1)
你可以打手势
let recognizer = UITapGestureRecognizer(target: self,action:#selector(self.handleTap(recognizer:)))
userImage.isUserInteractionEnabled = true
recognizer.delegate = self as? UIGestureRecognizerDelegate
userImage.addGestureRecognizer(recognizer)
方法调用选择器
func handleTap(recognizer:UITapGestureRecognizer) {
// do your coding here on method
}
答案 2 :(得分:0)
尝试编写代码
let gesture = UITapGestureRecognizer(target: self, action: #selector(self.onTap))
gesture.delegate = self
self.addGestureRecognizer(gesture)
内的init
块内的
不在awakeFromNib()
答案 3 :(得分:0)
我注意到你在UIView上添加手势。因此,在ViewController
您已添加此ContainerView的viewDidLoad
方法中,添加此行代码。
override func viewDidLoad() {
super.viewDidLoad()
self.YourContainerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(YourCurrentViewController.openDatePicker())))
self.YourContainerView.isUserInteractionEnabled = true
}
请注意。不要忘记将isUserInteractionEnabled
添加到true。