2011-06-30 17 views
13

He leído y probar este article (Opening door effect using Core Animation)¿Cómo rotar un UIImageView con CATransform3DRotate hace un efecto como la apertura de la puerta?

Y Implementar siguiente código en mi aplicación:

CALayer *layer = threeHomeView.layer; 
CATransform3D initialTransform = threeHomeView.layer.transform; 
initialTransform.m34 = 1.0/-900; 

[UIView beginAnimations:@"Scale" context:nil]; 
[UIView setAnimationDuration:3]; 
layer.transform = initialTransform; 
CATransform3D rotationAndPerspectiveTransform = threeHomeView.layer.transform; 

rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform 
                 , 40.0f * M_PI/180.0f 
                 , 0.0f 
                 , 1.0f 
                 , 0.0f); 
layer.transform = rotationAndPerspectiveTransform; 

[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(threeHomeFlyOut)]; 
[UIView commitAnimations]; 

threeHomeView es un UIImageView.

MI PREGUNTA ES: la imagen solo puede rotar en la línea vertical media de la imagen, pero quiero que gire en la línea vertical izquierda de la imagen.

+0

estoy teniendo el mismo problema y tratar de establecer un tutorial adecuado/explicación más a fondo aquí: http: // stackoverflow.com/questions/7685547/3d-door-open-animation-between-two-uiviewcontrollers –

Respuesta

15

Use CATransform3DRotate como lo hizo en combinación con CATransform3DTranslate para girar alrededor del borde, como hice en this answer. He aquí un pequeño fragmento (que tendrá que modificar esto para sus propios usos):

CATransform3D t = CATransform3DIdentity; 
t = CATransform3DTranslate(t, 0, -self.view.bounds.size.height/2, 0); 
t = CATransform3DRotate(t, rec.scale * M_PI, 1, 0, 0); 
t = CATransform3DTranslate(t, 0, -self.view.bounds.size.height/2, 0); 
self.view.layer.transform = t; 
+0

¡Gracias, simplemente funciona! – ZYiOS

+0

@jtbandes Intenté aplicar esto a una animación 3D Door Open, pero no se verá realista. Tengo mi código de ejemplo aquí: http://stackoverflow.com/questions/7685547/3d-door-open-animation-between-two-uiviewcontrollers ¿Podría ser tan amable y echar un rápido vistazo? –

+0

Podemos establecer un punto de anclaje al borde necesario y hacer una rotación sin traducción, ¿no es así? – dmitrynikolaev

3
- (void)awakeFromNib { 

    transformed = [CALayer layer]; 

    transformed.frame = self.bounds; 

    [self.layer addSublayer:transformed]; 

    CALayer *imageLayer = [CALayer layer]; 

    imageLayer.frame = CGRectMake(10.0f, 4.0f, 300.0f, 226.0f); 

    imageLayer.transform = CATransform3DMakeRotation(20.0f * M_PI/180.0f, 
                1.0f, 0.0f, 0.0f); 

    imageLayer.contents = (id)[[UIImage imageNamed:@"IMG_0051.png"] CGImage]; 

    [transformed addSublayer:imageLayer]; 

    imageLayer = [CALayer layer]; 

    imageLayer.frame = CGRectMake(10.0f, 234.0f, 300.0f, 226.0f); 

    imageLayer.transform = CATransform3DMakeRotation(-20.0f * M_PI/180.0f, 
                1.0f, 0.0f, 0.0f); 

    imageLayer.contents = (id)[[UIImage imageNamed:@"IMG_0089.png"] CGImage]; 

    [transformed addSublayer:imageLayer]; 

} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    previousLocation = [[touches anyObject] locationInView:self]; 

} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    CGPoint location = [[touches anyObject] locationInView:self]; 

    // BJL: The following is the code I used in Molecules to do 3-D rotation 

    CATransform3D currentTransform = transformed.sublayerTransform; 

    CGFloat displacementInX = location.x - previousLocation.x; 

    CGFloat displacementInY = previousLocation.y - location.y; 


    CGFloat totalRotation = sqrt(displacementInX * displacementInX + displacementInY * displacementInY); 

    CATransform3D rotationalTransform = CATransform3DRotate(currentTransform, totalRotation * M_PI/180.0, 
                    ((displacementInX/totalRotation) * currentTransform.m12 + (displacementInY/totalRotation) * currentTransform.m11), 
                    ((displacementInX/totalRotation) * currentTransform.m22 + (displacementInY/totalRotation) * currentTransform.m21), 
                    ((displacementInX/totalRotation) * currentTransform.m32 + (displacementInY/totalRotation) * currentTransform.m31)); 

    previousLocation = location; 

    transformed.sublayerTransform = rotationalTransform; 

} 
Cuestiones relacionadas