Как повернуть UIImageView с CATransform3DRotate, чтобы создать эффект, как открытие двери? - PullRequest
14 голосов
/ 30 июня 2011

Я прочитал и попробовал эту статью (Эффект открытия двери с использованием Core Animation)

И я реализую следующий код в моем приложении:

    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такое UIImageView

МОЙ ВОПРОС ЕСТЬ: изображение может вращаться только по средней вертикальной линии изображения, но я хочу, чтобы оно вращалось по левой вертикальной линии изображения.

Ответы [ 2 ]

16 голосов
/ 03 июля 2011

Используйте CATransform3DRotate, как вы делали в комбинации с CATransform3DTranslate, чтобы вращаться вокруг края, как я делал в в этом ответе . Вот небольшой отрывок (вам нужно изменить это для своих собственных нужд):

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;
3 голосов
/ 27 февраля 2013
- (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;

}
...