2010-03-19 10 views
5

questo può sembrare divertente, ma ho trascorso ore cercando di ricreare una manopola con una rotazione realistica utilizzando UIView e alcuni trig. Ho raggiunto l'obiettivo, ma ora non riesco a capire come sapere se la manopola sta ruotando a sinistra oa destra. La parte più pertinente della matematica è qui:ottenere la direzione di rotazione di UIView su touchesMoved

 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint pt = [touch locationInView:self]; 

    float dx = pt.x - iv.center.x; 
    float dy = pt.y - iv.center.y; 
    float ang = atan2(dy,dx); 

    //do the rotation 
    if (deltaAngle == 0.0) { 
     deltaAngle = ang; 
     initialTransform = iv.transform; 
    }else 
    { 
     float angleDif = deltaAngle - ang; 
     CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif); 
     iv.transform = newTrans; 
     currentValue = [self goodDegrees:radiansToDegrees(angleDif)]; 
    } 
} 

idealmente, ho potuto sfruttare un valore numerico di dirmi se la rotazione è positivo o negativo.

risposta

3

se il punto centrale della manopola è il centro dell'immagine che si sta utilizzando per la manopola, si dovrebbe essere in grado di rilevare se il tocco inizia a sinistra/destra del centro e si sposta verso l'alto/verso il basso. Se il tocco inizia a sinistra e si sposta verso il basso, viene ruotato a sinistra. viceversa per i tocchi che iniziano dall'altra parte del centro. è possibile rilevare se i tocchi si muovono verso l'alto o verso il basso posizionando le successive coordinate x in un array con il metodo touchDidMove e facendo un semplice confronto.

0

Grazie Rimozione. Questo è vicino a ciò di cui avevo bisogno, ma alla fine, dato che l'oggetto manopola sta passando un evento a una classe controller, avevo bisogno di un modo per misurare il valore dalla rotazione ... cioè 340 * è il 94% in CClockWise. Comunque, ho finito per risolvere questo problema usando il metodo sopra e passando il valore corrente a un delegato. Il delegato avrebbe poi prendere quel metodo e con il proprio galleggiante privata, confrontare se il valore è superiore o inferiore all'ultimo valore ricevuto:

// delegato utilizza un valore privato per misurare da ultimo richiamata #pragma mark UIKnobViewDelegate - (void) dialValue: valore (float) { if (lastValue == 0.00) { lastValue = lastValue; } if (valore

da lì, il nostro controller può fare tutto ciò che vuole