2015-12-22 11 views
6

Ich habe versucht, einen Snapchat-ähnlichen Bearbeitungstext auf einem Bild zu implementieren. Was ich bis jetzt gemacht habe, ist ein UILabel in der Mitte des UIImageView zu implementieren und ich habe 3 Gesten zu diesem UILabel hinzugefügt: UIPanGestureRecognizer, UIPinchGestureRecognizer & UIRotationGestureRecognizer.Snapchat-ähnlicher Text auf Bild

Ich habe es geschafft, die Pan-Methode zu implementieren, aber ich habe harte Zeit die Pinch + Rotation so glatt zu machen, wie sie es tun, bekomme ich T_T schreckliche Ergebnisse

Wie denkt ihr dies gemacht wurde? welche Komponenten sind in diesem & beteiligt, wenn Sie lesen/beobachten Material, das ich verwenden könnte, um dies zu erreichen.

Thanks :)

EDIT:

Dies sind die Methoden, die ich zu behandeln & Rotation umgesetzt Pinch:

func handlePinch(recognizer: UIPinchGestureRecognizer) { 
    if let view = recognizer.view as? UILabel { 
     view.transform = CGAffineTransformScale(view.transform, recognizer.scale, recognizer.scale) 
    } 
} 

func handleRotate(recognizer: UIRotationGestureRecognizer) { 
    if let view = recognizer.view as? UILabel { 
     view.transform = CGAffineTransformRotate(view.transform, recognizer.rotation) 
    } 
} 

Vorschau Video, wie die Prise ich Werke umgesetzt: https://drive.google.com/file/d/0B-AVM51jxsvUY2RUUHdWbGo5QlU/view?usp=sharing

enter image description here

+0

Zeigen Sie den Code, wie Sie tun, um die Rotation –

+0

@ Mr.T Hallo, ich meine Post bearbeitet und hinzugefügt diejenigen. Vielen Dank! :) – EpicSyntax

+0

Worin besteht das Problem? –

Antwort

4

Gefunden eine Lösung, anscheinend alles, was ich in der Rotation tun musste & Pinch ist immer die Ansicht Rotation/Skala zurückzusetzen. Setzen Sie beispielsweise meine recognizer.scale auf 1.0 und recognizer.rotation auf 0.0. Hier

ist ein Beispiel für meinen Code:

func handlePan(recognizer: UIPanGestureRecognizer) { 
    let translation = recognizer.translationInView(view) 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, 
      y:view.center.y + translation.y) 
    } 
    recognizer.setTranslation(CGPointZero, inView: view) 
} 

func handlePinch(recognizer: UIPinchGestureRecognizer) { 
    if let view = recognizer.view as? UILabel { 
     let pinchScale: CGFloat = recognizer.scale 
     view.transform = CGAffineTransformScale(view.transform, pinchScale, pinchScale) 
     recognizer.scale = 1.0 
    } 
} 

func handleRotate(recognizer: UIRotationGestureRecognizer) { 
    if let view = recognizer.view as? UILabel { 
     let rotation: CGFloat = recognizer.rotation 
     view.transform = CGAffineTransformRotate(view.transform, rotation) 
     recognizer.rotation = 0.0 
    } 
} 
0

Ich bin mir nicht sicher, ob dies ist genau das, was Sie suchen (Ich habe Snapchat nie benutzt), aber das Sie

einige Ideen

https://github.com/danielinoa/DIImageView

Ich bin mir nicht sicher, dass dies könnte man geben hat eine Prise Geste, aber ich bin mir nicht ganz sicher, wie Sie es meinen, es trotzdem zu benutzen.

Hier ist eine Demo des Projekts: https://www.cocoacontrols.com/controls/diimageview

Generell empfehle ich cocoacontrols jedes Mal, wenn Sie etwas zu implementieren wagen zu überprüfen. Es gibt normalerweise solide Beispiele, die Ihnen den Einstieg erleichtern, und manchmal finden Sie genau das, was Sie brauchen.

1

Für „es skaliert nach oben/unten viel zu viel in eine sehr aggressiven Art und Weise“:

Sie benötigen den Pinch-Geste Skalenwert nach Ihrem Bedarf zu behandeln.

Von Ihrer Erkenner Methode, können Sie den Skalenwert erhalten wie:

var pinchScale: CGFloat = recogniser.scale 

Sie diesen Wert ändern müssen entweder wie es verringern, indem/10 oder/100 nach Ihrem Bedarf, und verwenden Sie diesen Wert in dem Label-Transformation anstelle der Pangusture-Skala.

1

Das Problem, das Sie haben, ist, dass Ihr Code die aktuelle Transformation übernimmt und eine weitere Transformation basierend auf der aktuellen "Bewegung" hinzufügt, so dass Sie während einer einzelnen Bewegung Änderungen akkumulieren.

Behalten Sie die Instanzvariablen für Rotation, Skalierung und Bewegung bei, aktualisieren Sie die relevanten Variablen in den Aktionen Ihrer Gestenerkennung (Sie müssen auch den Status jeder einzelnen zu Beginn jeder Geste speichern, damit Sie die Anwendung anwenden können Delta in den Ausgangszustand), und erstellen Sie die Transformation von Grund auf mit diesen drei Variablen. Das Transformieren sollte natürlich in einer separaten Funktion faktorisiert werden, da Sie es mehrmals verwenden werden.