2017-03-03 18 views
0

私はいくつかのサブコントロール(図を参照)からなる再利用可能なMetaControlを作成しています。それはUIControlから継承し、2つの単純なUIButtonsと作成したカスタムスライダを含んでいます。 CustomSliderUIControlも継承します。 MetaControlの初期化子で親UIControlがtouchDownイベントに応答しないようにする

enter image description here

、私は変更の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") 
} 

私がいる問題がsliderTouched()イベントです。このイベントは、スライダに触れるたびに2回発生します。

  • 初めてMetaControlから送信されたようです。
  • CustomSliderから2回目に正しいイベントが渡されます。

私の質問は、CustomSliderがそのアクションを送信できるようにしながら、自分自身がイベントに応答するのを防ぐことができますか?

私はそれが余分なイベントをトリガMetaControlそのものであることを確認するには2つの方法を使用:

  • CustomSliderにコードを送信してアクションをコメントアウトします。でも、このコード行せずに、sliderTouched()はまだ呼ばれている:

    class CustomSlider: UIControl { 
        var isTouched = false { 
         didSet { 
          //sendActions(for: .touchDown) 
         } 
        } 
    } 
    
  • .applicationReserved.touchDownアクションを置き換え。私はもはや.touchDownを使用していないので、MetaControl.touchDownイベントは呼び出されません。

    class CustomSlider: UIControl { 
        var isTouched = false { 
         didSet { 
          sendActions(for: .applicationReserved) 
         } 
        } 
    } 
    

興味深いことに、UIButtonsない原因この同じ問題を行います。 UIButtonを押しても、2つのイベントは発生しません。この同じことをどうすれば達成できますか?

P.S.私がイベントをCustomSliderから送信させる方法は、CustomSliderの独自のイニシャライザに埋め込まれているカスタムUIPanGestureRecognizerです。

私はガイドラインとしてこれを使用する:私はこれについて、その後自身がUIControlから継承MetaControlにすべてのこれらのサブコントロールを埋め込む間違っway--をつもりはない願っていhttps://www.raywenderlich.com/82058/custom-control-tutorial-ios-swift-reusable-knob

P.P.Sを。 MetaControl自体はタッチイベントに応答することはなく、サブコントロールのみに応答します。私はMetaControlを主にコンテナとして使用して、共有状態を管理し、レイアウトに構造を提供し、コントロールを再利用できるようにしています。結局、私はそれらの多くが必要です。

enter image description here

答えて

0

答えはまた、スライダーでtouchesBeganを上書きすることを確認しました。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
} 
関連する問題