CustomView
包含一个子视图SubView
,它实现了一个点按处理程序。但是,对于此实施,SubView
应忽略点击并让CustomView
处理它们。
以下代码可以实现此目的,但将userInteractionEnabled
设置为false可防止SubView
上的点击级联到CustomView
。如果CustomView
SubView
设置为false,那么userInteractionEnabled
是否仍然会收到点击事件?
Apple文档说将userInteractionEnabled
设置为false
会导致事件被忽略,而不是视图会吞下它们,因此超视图不会接收它们。
// CustomView class, which is a subclass of UIView
// Handle taps
let singleTap = UITapGestureRecognizer(target: self, action: #selector(doTap))
addGestureRecognizer(singleTap)
// Add SubView
view.insertSubview(SubView, atIndex: 0)
SubView.userInteractionEnabled = false
更新的代码(doInit
在调用后调用buttonTapped
时调用)但仍无法正常工作:
class CustomButton : UIButton, UIGestureRecognizerDelegate {
private func doInit() {
...
// Handle taps
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(buttonTapped))
tapRecognizer.delegate = self
addGestureRecognizer(tapRecognizer)
}
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
答案 0 :(得分:0)
SubView
仍会收到点按,但会忽略它们,它会停在那里。如果视图将userInteractionEnabled
设置为false,则会阻止针对父视图的触摸。
我的猜测是你要添加这个手势识别器代表:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool
这将允许您的父视图与SubView
同时接收触摸。
答案 1 :(得分:0)
基于Laynemoseley的回答,这是来自the Apple docs的相关位:
在iOS 6.0及更高版本中, 默认控制操作可防止重叠手势识别器 行为。例如,按钮的默认操作是单个操作 挖掘。如果你有一个单击手势识别器附加到 按钮的父视图,用户点击按钮,然后点击按钮 动作方法接收触摸事件而不是手势 识别器。这仅适用于重叠的手势识别 控件的默认操作,包括:
单指点击UIButton,UISwitch,UIStepper, UISegmentedControl和UIPageControl。用一根手指轻扫一下 UISlider的旋钮,与滑块平行的方向。单身 UISwitch旋钮上的手指平移手势,平行方向 到开关。如果您有其中一个控件的自定义子类 并且您想要更改默认操作,请附加手势识别器 直接到控件而不是父视图。然后, 手势识别器首先接收触摸事件。一如既往,确定 阅读iOS人机界面指南以确保您的应用程序 提供直观的用户体验,特别是在覆盖时 标准控件的默认行为。
似乎唯一的解决方案是覆盖手势识别并允许同时手势被识别。