2012-04-16 10 views
6

Sto eseguendo alcuni calcoli di trascinamento e rotazione utilizzando UIPanGestureRecognizer. L'angolo di rotazione è corretto e la posizione di trascinamento è quasi corretta. Il problema è che mentre vai attorno al centro della scatola devi essere regolato secondo l'angolo e non riesco a capire come.Trascina + Rotazione utilizzando UIPanGestureRecognizer tocca come scendere dalla traccia

Ho incluso le immagini di come appare una rotazione di 180 ma dove si trova il dito durante la rotazione. Semplicemente non so come adattarmi per fare in modo che il blocco rimanga con le dita appropriatamente. Ed ecco un video solo per chiarire perché è uno strano comportamento. http://tinypic.com/r/mhx6a1/5

MODIFICA: Ecco un video del mondo reale di ciò che dovrebbe accadere. Il problema è che nel video dell'iPad il tuo dito si sta muovendo dove nel mondo reale il tuo dito verrebbe cementato in un punto particolare sull'oggetto in movimento. La matematica necessaria è quella di regolare la posizione del tocco lungo l'angolo con una differenza rispetto al centro effettivo. Non riesco a capire la matematica. http://tinypic.com/r/4vptnk/5

first shot

second shot

third shot

Grazie mille!

- (void)handlePan:(UIPanGestureRecognizer *)gesture 
{ 
    if (gesture.state == UIGestureRecognizerStateBegan) { 
     // set original center so we know where to put it back if we have to. 
     originalCenter = dragView.center; 

    } else if (gesture.state == UIGestureRecognizerStateChanged) { 
     [dragView setCenter:CGPointMake(originalCenter.x + [gesture translationInView:self.view].x , originalCenter.y + [gesture translationInView:self.view].y)]; 

     CGPoint p1 = button.center; 
     CGPoint p2 = dragView.center; 

     float adjacent = p2.x-p1.x; 
     float opposite = p2.y-p1.y; 

     float angle = atan2f(adjacent, opposite); 

     [dragView setTransform:CGAffineTransformMakeRotation(angle*-1)]; 

    } 
} 
+0

Il video è stato molto utile, grazie per farlo. Il blocco dovrebbe essere "ruotante" attorno al pulsante delle informazioni come se il pulsante delle informazioni fosse un bastone nel terreno, in modo tale che si stia cercando essenzialmente il rilevamento delle collisioni sul bastone? In questo caso, la matematica che stai cercando è più la distanza tra il bordo del rettangolo e il bordo esterno del pulsante informazioni. Potrei avere del codice che può aiutare con quello dato la posizione arbitraria del blocco mentre lo spingi in giro con il dito. – tobinjim

+0

Questo è solo un piccolo progetto di prova di una funzionalità che sarà inserita in un progetto più ampio. il pulsante informazioni rappresenta un piccolo UIButton rotondo. Il blocco rappresenta ciò che sarà un rect UIImageView. Dovrebbe ruotare intorno e sempre rivolto verso il pulsante. Il problema è che mentre l'utente trascina il blocco, il dito si trova in posizione errata, il che provoca movimenti innaturali. Ho bisogno di un modo per tenere il dito nello stesso punto del blocco. Presumo che abbia a che fare con la regolazione del centro in base all'angolo e alla distanza del tocco dal centro originale. Non riesco a capire la matematica. –

+0

Quindi la domanda è questa: UIImageView dovrebbe rimanere "in contatto" con l'UIButton rotondo? Ho un codice che mantiene ciò che si potrebbe pensare come un suggerimento esattamente a 20 pixel sul lato di una forma che ruotava, quindi con un rettangolo che ruotava il tooltip doveva "scivolare" lontano dal centro del rettangolo come un angolo arrivò, e poi tornò indietro più vicino al centro mentre il lato stretto del rettangolo si stava muovendo. – tobinjim

risposta

8

ho finalmente risolto questo problema e lo hanno perfettamente funzionante. Persistenza, ho ragione ??

Ecco il codice per la soluzione con alcuni commenti per spiegare le modifiche.

- (void)handlePan:(UIPanGestureRecognizer *)gesture 
{ 
    if (gesture.state == UIGestureRecognizerStateBegan) { 
     // Get the location of the touch in the view we're dragging. 
     CGPoint location = [gesture locationInView:dragView]; 

     // Now to fix the rotation we set a new anchor point to where our finger touched. Remember AnchorPoints are 0.0 - 1.0 so we need to convert from points to that by dividing 
     [dragView.layer setAnchorPoint:CGPointMake(location.x/dragView.frame.size.width, location.y/dragView.frame.size.height)]; 


    } else if (gesture.state == UIGestureRecognizerStateChanged) { 
     // Calculate Our New Angle 
     CGPoint p1 = button.center; 
     CGPoint p2 = dragView.center; 

     float adjacent = p2.x-p1.x; 
     float opposite = p2.y-p1.y; 

     float angle = atan2f(adjacent, opposite); 

     // Get the location of our touch, this time in the context of the superview. 
     CGPoint location = [gesture locationInView:self.view]; 

     // Set the center to that exact point, We don't need complicated original point translations anymore because we have changed the anchor point. 
     [dragView setCenter:CGPointMake(location.x, location.y)]; 

     // Rotate our view by the calculated angle around our new anchor point. 
     [dragView setTransform:CGAffineTransformMakeRotation(angle*-1)]; 

    } 
} 

Spero che il mio mese + lotta e soluzione aiuti qualcun altro in futuro. Felice di codifica :)

+0

Ovviamente il suo aiuto. – TheMall

+0

Questo è molto bello da sentire :) –

+1

Grazie per aver postato la risposta alla tua domanda una volta che l'hai capito. Molto apprezzato. Mi ha davvero aiutato. – Litome

Problemi correlati