私はいくつかのサブコントロール(図を参照)からなる再利用可能なMetaControl
を作成しています。それはUIControl
から継承し、2つの単純なUIButtons
と作成したカスタムスライダを含んでいます。 CustomSlider
はUIControl
も継承します。 MetaControl
の初期化子で親UIControlがtouchDownイベントに応答しないようにする
、私は変更の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
を主にコンテナとして使用して、共有状態を管理し、レイアウトに構造を提供し、コントロールを再利用できるようにしています。結局、私はそれらの多くが必要です。