2017-03-03 2 views
0

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

enter image description here

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 wird sliderTouched() 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 das MetaControl.touchDown Ereignis nie aufgerufen.

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

Interessanterweise machen die UIButtonsnicht 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.

enter image description here

Antwort

0

Die Antwort war auch touchesBegan im Schieber stellen Sie sicher, außer Kraft zu setzen.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
} 
Verwandte Themen