2011-08-29 13 views

Respuesta

18

Aquí está una función que utiliza el mismo formato que el CGAffineTransform CoreGraphics Formato de API.

Esto funciona exactamente como deberían funcionar otras API "RotateAt()".

La operación representa el equivalente de la siguiente especificación: translate (pt.x, pt.y); girar (ángulo); traducir (-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); 
} 

Al igual que con CGAffineTransformMakeRotation(), el ángulo en radianes, no grados.

+1

Supongo que pt es un centro? – Andy

+0

¿Por qué no puedes simplemente hacer una 'var t = CGAffineTransformMakeTranslation (-pt.x, -pt.y)' y luego hacer la rotación con 't = CGAffineTransformRotate (t, angel)' y luego traducir de nuevo con 'var t = CGAffineTransformTranslate (t, pt.x, pt.y) '? – Adam

+1

@ Adam Eso son 3 cosas que tienes que hacer. Mi respuesta es una llamada para hacer las tres. Extremadamente optimizado. Por favor, vuelva a leer mi respuesta, especialmente la tercera línea antes del código. – Andy

1

Acabo de darle una oportunidad. Algo así como que debe dar el resultado que busca ...

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

Sólo para explicar mi razonamiento un poco ...

Lo que estamos haciendo básicamente está cambiando físicamente la vista hasta el punto de rotación, luego aplicar una traducción para que parezca que se quedó en el punto original. Entonces, si multiplicamos una rotación por la nueva traducción de la vista, rotamos esencialmente toda la vista y su sistema de coordenadas, por lo que parece que gira alrededor del punto dado. Espero haber explicado eso bien. : | Si no, sugiero buscar matrices de transformación en línea, tal vez puedas encontrar mejores explicaciones sobre cómo se acumulan allí.

2

Establezca el punto de ancla de la capa de la vista de imagen en algo fuera de (0,0) y (1,1), es decir, view.layer.anchorPoint = CGPointMake (2, 2).

+0

Si va con esto, recuerde dos cosas: a) esto cambiará completamente donde se dibuja su vista, no solo la transformación b) los valores x e y de anchorPoint están en múltiplos del tamaño de la vista, creo. No están en el sistema de coordenadas de la vista principal. – mjisrawi

2

He resuelto de esta manera: Pongo el UIImage que quiero rotar en otra vista. La vista es más grande que la vista de la imagen, por lo que el punto central de la vista es el punto externo de la visualización, por lo que gire la vista ...

Cuestiones relacionadas