2016-04-17 8 views
1

In Lern ​​IOS Aktualisierung i eine App machte die Töne unter Verwendung AudioKit.io spielteine Oszillatorfrequenz von out-of-Viewcontroller

Wenn der Benutzer den Bildschirm tippt, wird ein neuer „Schlüssel“ gezogen wird und basierend In seiner X-Position wird die Frequenz des Oszillators eingestellt.

So jetzt möchte ich den Benutzer in der Lage sein, um die "Taste" zu ziehen und die Frequenz des Oszillators zu aktualisieren.

Ich nehme an, das ist eher eine Frage der Projektorganisation/logischen Organisation.

Es gibt:

  • ViewController.swift (macht Oszillatoren und zieht den Schlüssel: didTap, toggleSound)
  • CircularKeyView.swift (die Eigenschaften eines kreisförmigen Schlüssel: drawRect, didPan, etc)

von CircularKeyView.swift:

//PAN IT LIKE u FRYIN. 
func didPan(panGR: UIPanGestureRecognizer) { 

self.superview!.bringSubviewToFront(self) 

var translation = panGR.translationInView(self) 

self.center.x += translation.x 
self.center.y += translation.y 


panGR.setTranslation(CGPointZero, inView: self) 

//so the coordinates can be updated when there's a pan 
self.setNeedsDisplay() //updates the coordinates on a pan event 
//updateOscillatorFrequency here? 
} 

von circularKeyVi ew:

... 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let tapGR = UITapGestureRecognizer(target: self, action: "didTap:") 
     self.view.addGestureRecognizer(tapGR) 


     let mixer = AKMixer(oscillator, osc2) 
     AudioKit.output = mixer 
     AudioKit.start() 
    } 

    func didTap(tapGR: UITapGestureRecognizer) { 

     let tapPoint = tapGR.locationInView(self.view) 

     let newCircularKey = circularKeyView(origin: tapPoint) 

     self.view.addSubview(newCircularKey) 
     oscillator.frequency = Double(newCircularKey.center.x) * 2 
    } 

im Grunde, meine Frage ist: Wie kann ich das Verhalten von Panning zu Ändern einer Variablen (oder Array/Sammlung von Variablen) in dem Viewcontroller binden?

+0

Ich denke, das ist mit Delegierten getan .. so lerne ich darüber. Updates zu kommen vielleicht – sova

+0

Haben Sie das jemals herausgefunden? Ich versuche einen Sound zu aktualisieren, der mit einem AKPropertySlider spielt. Ich kann die Variablen aktualisieren, aber ich kann nicht herausfinden, wie man den Sound, der gerade läuft, aktualisiert. – Adrian

+0

@Adrian Hallo Adrian, es ist eine lange Zeit her, seit ich das Material angeschaut habe, aber ja, es ist möglich. Sie können die Delegaten und das Protokoll verwenden. Grundsätzlich erlaubt das Delegate-Muster Ihnen, Variablen zu erstellen, die global in Ihrer App existieren, und jede schnelle Datei, die das "Protokoll" implementiert, kann auf die Variable mit ihren Änderungen zugreifen, iirc. Wenn du Hilfe brauchst, öffne ich meinen alten Code und schaue nach. – sova

Antwort

1

Ich mag es fühlen sollte Ihr View-Controller in der Verantwortung zu schaffen die UIPanGestureRecognizer, sei es einzurichten und fügen Sie es Ihrer Ansicht (hier Ihre CircularKeyView).

Es sollte auch das Ziel dieses Gestenerkenners sein, damit es den Mittelpunkt der Ansicht in ein eigenes Koordinatensystem setzen kann (es erscheint wirklich seltsam, dass eine Ansicht ihren eigenen Rahmen aktualisiert). Wie Apples View Controller Programming Guide sagt: "Ein View-Controller ist verantwortlich für die Verwaltung seiner View-Hierarchie".

+0

Ich habe versucht, die Schwenkgeste live im viewController zu machen, aber das ist nicht wirklich so, wie es in einem Tutorial dargestellt wurde, dem ich folgte. https://www.wheartswift.com/bezier-paths-gesture-recognizers/ Ich habe seitdem ein großartiges Beispiel gefunden, das detailliert beschreibt, wie Delegation http://stackoverflow.com/questions/34938682/swift-delegate-protocol-structure und ich habe das gewünschte Verhalten erreicht, bei dem das Verschieben einer der CircularKeyViews (eine Unteransicht von ViewController) die Oszillatorfrequenz bei Pan anpasst. Der PanGesture lebt in der CircularKeysView und ein Delegat verarbeitet die aktualisierten Informationen. – sova

+0

Froh, dass es funktioniert ... Aber ich denke immer noch, dass Sie vielleicht zu einem robusteren Design wechseln möchten, wo Ihr View Controller dafür verantwortlich ist, Subviews zu verschieben, Gestenerkenner anzubringen und zu entfernen und Ihren Audiooszillator zu verwalten. Verschiedene Situationen werden sonst schwer zu handhaben sein: Was passiert, wenn Sie die Ansichtsgrenzen des View-Controllers schwenken?Was passiert, wenn zwei 'CircularKeyView's Gesture Recognizer gleichzeitig eine Pan erkennen, weil sie sich überlappen? Und mehr ... Eine Ansicht sollte bezüglich ihrer Umgebung sehr agnostisch sein und höchstens ihre 'bounds'-Eigenschaft verwenden, nicht ihren' frame'. – J2b

+0

Ich kann hinzufügen, dass in einigen Fällen es sinnvoll ist, eine Ansicht mit Gesture Recognizers umzugehen: wenn es mit einem internen Verhalten verknüpft ist. Ein gutes Beispiel wäre ein Slider, der aus Subviews wie dem Schieberegler besteht. Es ist sinnvoll, einen 'UIPanGestureRecognizer' zu verwalten, den Schieberegler zu bewegen und seinen Wert entsprechend zu ändern. – J2b