esiste un modo per ruotare UIImmagine attorno a un punto esterno utilizzando CGAffineTranformMAkeRotation? tnx molto!CGAffineTransformMakeRotazione attorno al punto esterno
risposta
Ecco una funzione che utilizza lo stesso formato del CoreGraphics CGAffineTransform Formato API
Questo funziona esattamente come altre API "RotateAt()" dovrebbero funzionare.
L'operazione rappresenta l'equivalente della seguente specifica: translate (pt.x, pt.y); ruotare (angolo); translate (-pt.x, -pt.y);
CGAffineTransform CGAffineTransformMakeRotationAt(CGFloat angle, CGPoint pt){
const CGFloat fx = pt.x, fy = pt.y, fcos = cos(angle), fsin = sin(angle);
return CGAffineTransformMake(fcos, fsin, -fsin, fcos, fx - fx * fcos + fy * fsin, fy - fx * fsin - fy * fcos);
}
Proprio come con CGAffineTransformMakeRotation()
, l'angolo è in radianti, non gradi.
Ho appena dato questo colpo. Qualcosa di simile dovrebbe darvi il risultato che stai cercando ...
- (void)rotateView:(UIView *)view aroundPoint:(CGPoint)point withAngle:(double)angle{
//save original view center
CGPoint originalCenter = view.center;
//set center of view to center of rotation
[view setCenter:point];
//apply a translation to bring the view back to its original point
view.transform = CGAffineTransformMakeTranslation(originalCenter.x, originalCenter.y);
//multiply the view's existing rotation matrix (the translation) by a rotation and apply it to the view
//thereby making it rotate around the external point
view.transform = CGAffineTransformConcat(view.transform, CGAffineTransformMakeRotation(angle));
}
Giusto per spiegare il mio ragionamento un po '...
Quello che stiamo facendo fondamentalmente è fisicamente spostando la vista al punto di rotazione, quindi applicando una traduzione per far sembrare che sia rimasta nel punto originale. Quindi, se moltiplichiamo una rotazione per la nuova traduzione della vista, ruotiamo essenzialmente l'intera vista e il suo sistema di coordinate, quindi sembra che ruoti attorno al punto specificato. Spero di averlo spiegato bene. : | Altrimenti, suggerisco di cercare le matrici di trasformazione online, forse puoi trovare spiegazioni migliori su come si impilano lì!
Imposta il punto di ancoraggio del livello della vista immagine su un valore diverso da (0,0) e (1,1), ovvero view.layer.anchorPoint = CGPointMake (2, 2).
Se andate con questo ricordate due cose: a) questo cambierà completamente dove viene disegnata la vostra vista, non solo la trasformazione b) i valori x e y di anchorPoint sono in multipli della dimensione della vista, credo. Non sono nel sistema di coordinate della vista principale. – mjisrawi
Ho risolto in questo modo: Ho messo la UIImmagine che voglio ruotare in un'altra vista. La vista è più grande della vista dell'immagine quindi il punto centrale della vista è il punto esterno della vista uiimage, quindi ruoto la vista ....
Suppongo che pt sia un centro? – Andy
Perché non puoi semplicemente fare una 'var t = CGAffineTransformMakeTranslation (-pt.x, -pt.y)' e poi fai la rotazione con 't = CGAffineTransformRotate (t, angel)' e poi traduci indietro con 'var t = CGAffineTransformTranslate (t, pt.x, pt.y) '? – Adam
@Adam Ecco 3 cose che devi fare. La mia risposta è una chiamata per fare tutte e tre le cose. Estremamente ottimizzato. Per favore rileggi la mia risposta, specialmente la terza riga prima del codice. – Andy