2015-12-22 23 views
6

Ho cercato di implementare un testo di modifica simile a Snapchat su un'immagine. Quello che ho fatto finora è implementare un UILabel nel centro di UIImageView e ho aggiunto 3 gesti a questo UILabel: UIPanGestureRecognizer, UIPinchGestureRecognizer & UIRotationGestureRecognizer.Testo simile a Snapchat sull'immagine

Sono riuscito a implementare il metodo Pan, ma sto avendo difficoltà a fare il Pinch + rotazione liscio come lo fanno, ottengo risultati orribili T_T

Come pensate voi ragazzi questo è stato fatto? quali componenti sono coinvolti in questo & se si dispone di materiale di lettura/visione che potrei usare per realizzare questo.

Grazie :)

EDIT:

Questi sono i metodi ho implementato per gestire Pinch & rotazione:

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) 
    } 
} 

Anteprima video di come il pizzico ho implementato opere: https://drive.google.com/file/d/0B-AVM51jxsvUY2RUUHdWbGo5QlU/view?usp=sharing

enter image description here

+0

Mostra il codice di come si fa la rotazione –

+0

@ Mr.T Ciao, ho modificato il mio post e ha aggiunto quelli. Grazie! :) – EpicSyntax

+0

Qual è il problema da affrontare? –

risposta

4

Trovato una soluzione, apparentemente tutto quello che dovevo fare nel Rotazione & Pizzico è quello di reimpostare sempre la rotazione/scala della vista. Ad esempio, impostando il mio recognizer.scale su 1.0 e recognizer.rotation su 0.0.

Ecco un esempio del mio codice:

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

io non sono sicuro se questo è esattamente quello che stai cercando (non ho mai usato Snapchat), ma questo potrebbe dare qualche idea

https://github.com/danielinoa/DIImageView

Non sono sicuro che questo ha un gesto di schiacciamento, ma non sono del tutto sicuro di come intendi che sia usato comunque.

Ecco una demo di quel progetto: https://www.cocoacontrols.com/controls/diimageview

In generale, vi consiglio di controllare cocoacontrols ogni volta che ci si avventura per implementare qualcosa di simile. Di solito ci sono solidi esempi per iniziare e, a volte, troverai esattamente ciò di cui hai bisogno.

1

Per "lo scale up/down modo troppo in un modo molto aggressivo":

è necessario gestire il valore di scala pizzico gesto base alle vostre necessità.

Dal vostro metodo di riconoscitore, si ottiene il valore della scala come:

var pinchScale: CGFloat = recogniser.scale 

È necessario modificare questo valore sia come diminuirlo di/10 o/100 secondo il vostro bisogno, e utilizzare questo valore nel trasformazione delle etichette anziché utilizzare la scala pangestura.

1

Il problema che si ha è che il codice prende la trasformazione corrente e aggiunge un'altra trasformazione basata sul "movimento" corrente, quindi si accumulano le modifiche (le si compongono, davvero) mentre ci si sposta durante un singolo gesto.

Mantieni variabili di istanza per la rotazione, la scala e il movimento, aggiorna quella pertinente in ciascuna delle azioni del tuo gesto di riconoscimento (dovrai anche memorizzare lo stato di ciascuna all'inizio di ogni gesto, in modo da poter applicare delta allo stato iniziale) e creare la trasformazione da zero utilizzando queste tre variabili. La creazione di trasformazioni dovrebbe ovviamente essere fattorizzata in una funzione separata, dal momento che la userai più volte.