Ios 阻止父UIControl响应触地事件

Ios 阻止父UIControl响应触地事件,ios,swift,uicontrol,target-action,Ios,Swift,Uicontrol,Target Action,我正在创建一个可重用的元控件,它由几个子控件组成(参见图)。它继承自UIControl,包含2个简单的ui按钮和我创建的自定义滑块。CustomSlider也继承自UIControl 在MetaControl的初始值设定项中,我添加了一些从子控件接收事件的目标操作,以通知MetaControl更改 class MetaControl: UIControl { public override init(frame: CGRect) { self.slider.addTar

我正在创建一个可重用的
元控件
,它由几个子控件组成(参见图)。它继承自
UIControl
,包含2个简单的
ui按钮和我创建的自定义滑块。
CustomSlider
也继承自
UIControl

MetaControl
的初始值设定项中,我添加了一些从子控件接收事件的目标操作,以通知
MetaControl
更改

class MetaControl: UIControl {
    public override init(frame: CGRect) {
        self.slider.addTarget(self, action: #selector(sliderValueChanged), for: .valueChanged)
        self.slider.addTarget(self, action: #selector(sliderTouched), for: .touchDown)
        self.button1.addTarget(self, action: #selector(button1Pressed), for: .touchDown)
        self.button2.addTarget(self, action: #selector(button2Pressed), for: .touchDown)
    }
}
然后,我把选择器:

@objc private func sliderTouched() {
     print("The slider was touched")
}
我遇到的问题是
slidertouch()
事件。每当我触摸滑块时,此事件将触发两次。

  • 第一次似乎是从
    元控件本身发送的
  • 第二次是从
    CustomSlider
    本身传递的正确事件
我的问题是,如何防止
MetaControl
本身响应事件,同时仍然允许我的
CustomSlider
发送其操作

我用两种方法确认触发额外事件的是
元控制本身:

  • 注释掉
    CustomSlider
    中的操作发送代码。即使没有这行代码,
    slidertouch()
    仍然被调用:

    class CustomSlider: UIControl {
         var isTouched = false {
            didSet {
                //sendActions(for: .touchDown)
            } 
        }
    }
    
  • .touchtdown
    操作替换为
    .applicationReserved
    。由于我不再使用
    .touchtdown
    ,因此不会调用
    MetaControl
    .touchtdown
    事件

    class CustomSlider: UIControl {
        var isTouched = false {
            didSet {
                sendActions(for: .applicationReserved)
            } 
        }
    }
    
有趣的是,
ui按钮
不会引起同样的问题。按下
ui按钮
不会触发两个事件。我怎样才能实现同样的目标

另外,我从
CustomSlider
发送事件的方式是通过嵌入到
CustomSlider
自身初始值设定项中的自定义
UIPangestureRecognitor

我以此为指导:

p.p.S我希望我没有走错方向——将所有这些子控件嵌入一个
元控件
,然后它本身继承自
UIControl
元控制
本身从不响应触摸事件——只有子控制。我使用的
MetaControl
主要是作为一个容器来管理共享状态,为布局提供结构,并使控件可重用。最终,我需要很多


答案是确保也覆盖滑块中的
触摸开始

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
}