禁用子视图的用户交互会干扰superview的事件处理吗?

时间:2016-05-16 22:22:35

标签: ios uiview uikit

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
    }
}

2 个答案:

答案 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人机界面指南以确保您的应用程序   提供直观的用户体验,特别是在覆盖时   标准控件的默认行为。

似乎唯一的解决方案是覆盖手势识别并允许同时手势被识别。