Ich erstelle ein wiederverwendbares MetaControl
, das aus einigen Untersteuerelementen besteht (siehe Bild). Er erbt von UIControl
und enthält 2 einfache UIButtons
und einen benutzerdefinierten Schieberegler, den ich erstellt habe. Die CustomSlider
erbt auch von UIControl
.Verhindern, dass Eltern-UIControl auf touchDown-Ereignisse reagiert
In der MetaControl
‚s initializer, ich fügen Sie einige Ziel Aktionen, die Ereignisse aus den Unter Kontrollen erhalten die MetaControl
von Änderungen zu informieren.
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)
}
}
und dann später habe ich die Wähler:
@objc private func sliderTouched() {
print("The slider was touched")
}
Das Problem, das ich habe, ist mit dem sliderTouched()
Ereignis. Dieses Ereignis wird zweimal ausgelöst, wenn ich den Schieberegler berühre.
- Das erste Mal von der selbst
MetaControl
geschickt zu sein scheint. - Das zweite Mal ist das richtige Ereignis von der
CustomSlider
selbst übergeben.
Meine Frage ist, wie kann ich die MetaControl
sich von der Reaktion auf Ereignisse zu verhindern, während immer noch meine CustomSlider
ermöglicht seinen Aktionen zu schicken?
verwenden ich 2 Möglichkeiten, um zu bestätigen, dass es die MetaControl
selbst war, die das zusätzliche Ereignis ausgelöst:
kommentiert aus dem Aktionscode in den
CustomSlider
senden. Auch ohne diese Zeile Code wirdsliderTouched()
noch genannt:class CustomSlider: UIControl { var isTouched = false { didSet { //sendActions(for: .touchDown) } } }
Ersetzt die
.touchDown
Aktion mit.applicationReserved
. Da ich.touchDown
nicht mehr verwende, wird dasMetaControl
.touchDown
Ereignis nie aufgerufen.class CustomSlider: UIControl { var isTouched = false { didSet { sendActions(for: .applicationReserved) } } }
Interessanterweise machen die UIButtons
nicht Ursache dieses gleiche Problem. Durch Drücken der UIButton
werden nicht zwei Ereignisse ausgelöst. Wie kann ich das Gleiche erreichen?
P.S. Die Art und Weise, wie ich die Ereignisse von der CustomSlider
gesendet habe, geschieht über eine benutzerdefinierte UIPanGestureRecognizer
, die in den eigenen Initialisierer der CustomSlider
eingebettet ist.
habe ich dies als Richtlinie: https://www.raywenderlich.com/82058/custom-control-tutorial-ios-swift-reusable-knob
P.P.S ich hoffe ich bin nicht darüber gehen die falsche way-- all diese Unter Kontrollen in eine MetaControl
Einbettung, die sich von UIControl
erbt dann. Die MetaControl
selbst reagiert nie auf Berührungsereignisse - nur die Untersteuerungen.Ich verwende die MetaControl
meist als Container, um den gemeinsamen Status zu verwalten, dem Layout Struktur zu geben und die Kontrolle wiederverwendbar zu machen. Irgendwann brauche ich viele von ihnen.