2012-04-09 34 views
5

Vì vậy, tôi đang cố gắng để thực hiện một phim hoạt hình mà là trong ứng dụng này http://itunes.apple.com/us/app/spg-mobile-app/id312306003?mt=8 đó là trong giao diện đầu tiên3D Animation - CABasicAnimation và CATransform3D cho khoảng cách giữa các quan điểm

tôi đã thực hiện hình ảnh động cho lật quan điểm và tôi đang thành công trong việc hiệu ứng động một bên và khi tôi đã đưa ra logic ngược cho lật ngược lại, nó được đưa ra một số khoảng cách giữa các quan điểm

đây là mã của tôi

- (UIImage *)screenShot: (UIView *) aView 
{ 
    // Arbitrarily masks to 40%. Use whatever level you like 
    UIGraphicsBeginImageContext(hostView.frame.size); 
    [aView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    CGContextSetRGBFillColor (UIGraphicsGetCurrentContext(), 0, 0, 0, 0.4f); 
    CGContextFillRect (UIGraphicsGetCurrentContext(), hostView.frame); 
    UIGraphicsEndImageContext(); 
    return image; 
} 


- (CALayer *) createLayerFromView: (UIView *) aView transform: (CATransform3D) transform 
{ 

    CALayer *imageLayer = [CALayer layer]; 
    imageLayer.anchorPoint = CGPointMake(1.0f, 1.0f); 
    imageLayer.frame = (CGRect){.size = hostView.frame.size}; 
    imageLayer.transform = transform; 
    UIImage *shot = [self screenShot:aView]; 
    imageLayer.contents = (__bridge id) shot.CGImage; 

    return imageLayer; 
} 

- (void)animationDidStart:(CAAnimation *)animation 
{ 

    UIView *source = (UIView *) _source; 
    [source removeFromSuperview]; 
} 

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished 
{ 

    UITableView *dest = (UITableView *) destination; 
    dest.frame = CGRectMake(160, 0, 160, 460); 
    [hostView addSubview:dest]; 
    [transformationLayer removeFromSuperlayer]; 


    //if (delegate) 
    //SAFE_PERFORM_WITH_ARG(delegate, @selector(segueDidComplete), nil); 
} 

-(void)animateWithDuration: (CGFloat) aDuration 
{ 
    goesForward=FALSE ; 

    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.delegate = self; 
    group.duration = aDuration; 

    CGFloat halfWidth = hostView.frame.size.width; // 2.0f; 
    float multiplier = goesForward ? -1.0f : 1.0f; 

    CABasicAnimation *translationX = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"]; 
    translationX.toValue = [NSNumber numberWithFloat:multiplier * halfWidth]; 

    CABasicAnimation *translationZ = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.z"]; 
    translationZ.toValue = [NSNumber numberWithFloat:-200.0]; //halfWidth]; 

    CABasicAnimation *rotationY = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"]; 
    rotationY.toValue = [NSNumber numberWithFloat: multiplier * M_PI_2]; 

    group.animations = [NSArray arrayWithObjects: rotationY, translationX, translationZ, nil]; 
    group.fillMode = kCAFillModeForwards; 
    group.removedOnCompletion = NO; 

    [CATransaction flush]; 
    [transformationLayer addAnimation:group forKey:kAnimationKey]; 
} 

- (void) constructRotationLayer 
{ 

    UIView *source = (UIView *) _source; 
    UIView *dest = (UIView *) destination; 
    hostView = [source superview]; 

    // if ([hostView isKindOfClass:[UIWindow class]]) { 
    //  NSLog(@"I am window class"); 
    // } 

    transformationLayer = [CALayer layer]; 
    transformationLayer.frame = hostView.bounds; //CGRectMake(40, 0, 280, 460);  
    transformationLayer.anchorPoint = CGPointMake(0.5f, 0.5f); 
    CATransform3D sublayerTransform = CATransform3DIdentity; 
    sublayerTransform.m34 = 1.0/-1000; 
    [transformationLayer setSublayerTransform:sublayerTransform]; 
    [hostView.layer addSublayer:transformationLayer]; 


    CATransform3D transform = CATransform3DMakeTranslation(0, 0, 0); 
    [transformationLayer addSublayer:[self createLayerFromView:source transform:CATransform3DRotate(transform, M_PI_2, 0, 0, 0)]]; 

    transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
    transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 

    if (!goesForward) 
    { 
     transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
     transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
    } 

    [transformationLayer addSublayer:[self createLayerFromView:dest transform:transform]]; 
} 

- (void)perform 
{ 
    [self constructRotationLayer]; 
    [self animateWithDuration:0.4f]; 
} 

vì vậy, ở đây tôi đang kêu gọi thực hiện phương pháp đầu tiên và đây tôi đã tải lên tổng mã của tôi Here


Mã này đã làm việc cho tôi một chút nhưng vẫn nhận được một số khoảng cách, điều này là khung về quan điểm đi và điểm đến sẽ cùng

- (UIImage *)screenShot: (UIView *) aView 
{ 
    // Arbitrarily masks to 40%. Use whatever level you like 
    UIGraphicsBeginImageContext(hostView.frame.size); 
    [aView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    CGContextSetRGBFillColor (UIGraphicsGetCurrentContext(), 0, 0, 0, 0.4f); 
    CGContextFillRect (UIGraphicsGetCurrentContext(), hostView.frame); 
    UIGraphicsEndImageContext(); 
    return image; 
} 


- (CALayer *) createLayerFromView: (UIView *) aView transform: (CATransform3D) transform 
{ 
    CALayer *imageLayer = [CALayer layer]; 
    imageLayer.anchorPoint = CGPointMake(1.0f, 1.0f); 
    imageLayer.frame = (CGRect){.size = hostView.frame.size}; 
    imageLayer.transform = transform; 
    UIImage *shot = [self screenShot:aView]; 
    imageLayer.contents = (__bridge id) shot.CGImage; 
    return imageLayer; 
} 

- (void)animationDidStart:(CAAnimation *)animation 
{ 
// UIView *source = (UIView *) super.sourceViewController; 
    [source removeFromSuperview]; 
} 

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished 
{ 
// UIView *dest = (UIView *) super.destinationViewController; 
    if (hostView !=nil) { 
     NSLog(@"hostView %@",hostView); 
     if (dest) { 
    [hostView addSubview:dest];    
     } 
    } 

    [transformationLayer removeFromSuperlayer]; 
    if (delegate) 
     SAFE_PERFORM_WITH_ARG(delegate, @selector(segueDidComplete), nil); 

} 

-(void)animateWithDuration: (CGFloat) aDuration 
{ 
    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.delegate = self; 
    group.duration = aDuration; 

    CGFloat halfWidth = hostView.frame.size.width/2.0f; 
    float multiplier = goesForward ? -1.0f : 1.0f; 

    CABasicAnimation *translationX = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"]; 
    translationX.toValue = [NSNumber numberWithFloat:multiplier * halfWidth]; 

    CABasicAnimation *translationZ = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.z"]; 
    translationZ.toValue = [NSNumber numberWithFloat:-halfWidth]; 

    CABasicAnimation *rotationY = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"]; 
    rotationY.toValue = [NSNumber numberWithFloat: multiplier * M_PI_2]; 

    group.animations = [NSArray arrayWithObjects: rotationY, translationX, translationZ, nil]; 
    group.fillMode = kCAFillModeForwards; 
    group.removedOnCompletion = NO; 

    [CATransaction flush]; 
    [transformationLayer addAnimation:group forKey:kAnimationKey]; 

} 

- (void) constructRotationLayer 
{ 
// UIView *source = (UIView *) super.sourceViewController; 
// UIView *dest = (UIView *) super.destinationViewController; 
    hostView = source.superview; 

    transformationLayer = [CALayer layer]; 
    transformationLayer.frame = hostView.bounds; 
    transformationLayer.anchorPoint = CGPointMake(0.5f, 0.5f); 
    CATransform3D sublayerTransform = CATransform3DIdentity; 
    sublayerTransform.m34 = 1.0/-1000; 
    [transformationLayer setSublayerTransform:sublayerTransform]; 
    [hostView.layer addSublayer:transformationLayer]; 

    CATransform3D transform = CATransform3DMakeTranslation(0, 0, 0); 
    [transformationLayer addSublayer:[self createLayerFromView:source transform:transform]]; 

    transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
    transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
    if (!goesForward) 
    { 
     transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
     transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
    } 

    [transformationLayer addSublayer:[self createLayerFromView:dest transform:transform]]; 
} 

- (void)perform 
{ 
    [self constructRotationLayer]; 
    [self animateWithDuration:0.4f]; 
} 
+0

Các Mẫu mã là không đầy đủ. Nó sẽ không xây dựng vì nó thiếu các tập tin cho RotatingFlipSegue – Abizern

+0

@Charan i cũng yêu cầu xem đó. Bạn có thể chia sẻ nó không? Nó sẽ là tuyệt vời nếu bạn tải lên mã demo của bạn để git và chia sẻ với chúng tôi. – Siten

Trả lời

4

Cuối cùng giải quyết vấn đề của tôi, điều sai lầm với điểm neo

- (UIImage *)screenShot: (UIView *) aView 
{ 
    // Arbitrarily masks to 40%. Use whatever level you like 
    UIGraphicsBeginImageContext(hostView.frame.size); 
    [aView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    CGContextSetRGBFillColor (UIGraphicsGetCurrentContext(), 0, 0, 0, 0.4f); 
    CGContextFillRect (UIGraphicsGetCurrentContext(), hostView.frame); 
    UIGraphicsEndImageContext(); 
    return image; 
} 


- (CALayer *) createLayerFromView: (UIView *) aView transform: (CATransform3D) transform 
{ 
    CALayer *imageLayer = [CALayer layer]; 
    imageLayer.anchorPoint = CGPointMake(1.0f, 1.0f); 
    imageLayer.frame = (CGRect){.size = hostView.frame.size}; 
    imageLayer.transform = transform; 
    UIImage *shot = [self screenShot:aView]; 
    imageLayer.contents = (__bridge id) shot.CGImage; 
    return imageLayer; 
} 

- (void)animationDidStart:(CAAnimation *)animation 
{ 
// UIView *source = (UIView *) super.sourceViewController; 
    [source removeFromSuperview]; 
} 

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished 
{ 
// UIView *dest = (UIView *) super.destinationViewController; 
    if (hostView !=nil) { 
     NSLog(@"hostView %@",hostView); 
     if (dest) { 
    [hostView addSubview:dest];    
     } 
    } 

    [transformationLayer removeFromSuperlayer]; 
    if (delegate) 
     SAFE_PERFORM_WITH_ARG(delegate, @selector(segueDidComplete), nil); 

} 

-(void)animateWithDuration: (CGFloat) aDuration 
{ 
    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.delegate = self; 
    group.duration = aDuration; 

    CGFloat halfWidth = hostView.frame.size.width/2.0f; 
    float multiplier = goesForward ? -1.0f : 1.0f; 

    CABasicAnimation *translationX = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"]; 
    translationX.toValue = [NSNumber numberWithFloat:multiplier * halfWidth]; 

    CABasicAnimation *translationZ = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.z"]; 
    translationZ.toValue = [NSNumber numberWithFloat:-halfWidth]; 

    CABasicAnimation *rotationY = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"]; 
    rotationY.toValue = [NSNumber numberWithFloat: multiplier * M_PI_2]; 

    group.animations = [NSArray arrayWithObjects: rotationY, translationX, translationZ, nil]; 
    group.fillMode = kCAFillModeForwards; 
    group.removedOnCompletion = NO; 

    [CATransaction flush]; 
    [transformationLayer addAnimation:group forKey:kAnimationKey]; 

} 

- (void) constructRotationLayer 
{ 
// UIView *source = (UIView *) super.sourceViewController; 
// UIView *dest = (UIView *) super.destinationViewController; 
    hostView = source.superview; 

    transformationLayer = [CALayer layer]; 
    transformationLayer.frame = hostView.bounds; 
    transformationLayer.anchorPoint = CGPointMake(0.5f, 0.5f); 
    CATransform3D sublayerTransform = CATransform3DIdentity; 
    sublayerTransform.m34 = 1.0/-1000; 
    [transformationLayer setSublayerTransform:sublayerTransform]; 
    [hostView.layer addSublayer:transformationLayer]; 

    CATransform3D transform = CATransform3DMakeTranslation(0, 0, 0); 
    [transformationLayer addSublayer:[self createLayerFromView:source transform:transform]]; 

    transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
    transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
    if (!goesForward) 
    { 
     transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
     transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
    } 

    [transformationLayer addSublayer:[self createLayerFromView:dest transform:transform]]; 
} 

- (void)perform 
{ 
    [self constructRotationLayer]; 
    [self animateWithDuration:0.4f]; 
} 
2

Tôi cũng làm như vậy. Mã làm việc của tôi là dưới đây. Xin vui lòng thích nó.

- (UIImage *)screenShot: (UIView*) aView 
    { 
     // Arbitrarily masks to 40%. Use whatever level you like 
     UIGraphicsBeginImageContext(hostView.frame.size); 
     [aView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     CGContextSetRGBFillColor (UIGraphicsGetCurrentContext(), 0, 0, 0, 0.4f); 
     CGContextFillRect (UIGraphicsGetCurrentContext(), hostView.frame); 
     UIGraphicsEndImageContext(); 
     return image; 
    } 


    - (CALayer*) createLayerFromView: (UIView *) aView transform: (CATransform3D) transform 
    { 
     CALayer *imageLayer = [CALayer layer]; 
     imageLayer.anchorPoint = CGPointMake(1.0f, 1.0f); 
     imageLayer.frame  = (CGRect){.size = hostView.frame.size}; 
     imageLayer.transform = transform; 
     UIImage *shot   = [self screenShot:aView]; 
     imageLayer.contents = (id) shot.CGImage; 

     return imageLayer; 
    } 

    - (void)animationDidStart:(CAAnimation *)animation 
    { 
     UIViewController *source; 
     if (islogin) { 
      source = (UIViewController *)self.navigationController; 
     } 
     else 
      source = (UIViewController *)self.joinTABBARController; 
     [source.view removeFromSuperview]; 
    } 

    - (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished 
    { 
     UIViewController *dest; 
     if (islogin) { 
      dest = (UIViewController *) self.joinTABBARController; 
     } 
     else 
      dest = (UIViewController *)self.navigationController; 
     [hostView addSubview:dest.view]; 
     [transformationLayer removeFromSuperlayer]; 
    // if (delegate) 
    //  SAFE_PERFORM_WITH_ARG(delegate, @selector(segueDidComplete), nil); 
    } 

    //-(void)animateWithDuration: (CGFloat) aDuration 
    //{ 
    // CAAnimationGroup *group = [CAAnimationGroup animation]; 
    // group.delegate = self; 
    // group.duration = aDuration; 
    //  
    // CGFloat halfWidth = hostView.frame.size.width/2.0f; 
    // float multiplier = goesForward ? -1.0f : 1.0f; 
    //  
    // CABasicAnimation *translationX = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"]; 
    // translationX.toValue = [NSNumber numberWithFloat:multiplier * halfWidth]; 
    //  
    // CABasicAnimation *translationZ = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.z"]; 
    // translationZ.toValue = [NSNumber numberWithFloat:-halfWidth]; 
    //  
    // CABasicAnimation *rotationY = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"]; 
    // rotationY.toValue = [NSNumber numberWithFloat: multiplier * M_PI_2]; 
    //  
    // group.animations = [NSArray arrayWithObjects: rotationY, translationX, translationZ, nil]; 
    // group.fillMode = kCAFillModeForwards; 
    // group.removedOnCompletion = NO; 
    //  
    // [CATransaction flush]; 
    // [transformationLayer addAnimation:group forKey:kAnimationKey]; 
    //} 

    - (void) constructRotationLayer:(TranDirection)aDirection 
    { 
     UIViewController *source; 
     UIViewController *dest; 
     if (islogin) { 
      source = (UIViewController *) self.navigationController; 
      dest = (UIViewController*) self.joinTABBARController; 
     } 
     else 
     { 
      source = (UIViewController *) self.joinTABBARController; 
      dest = (UIViewController *) self.navigationController; 
     } 
     hostView = source.view.superview; 

     transformationLayer    = [CALayer layer]; 
     transformationLayer.frame  = hostView.bounds; 
     transformationLayer.anchorPoint = CGPointMake(0.5f, 0.5f); 
     CATransform3D sublayerTransform = CATransform3DIdentity; 
     sublayerTransform.m34   = 1.0/-1000; 
     [transformationLayer setSublayerTransform:sublayerTransform]; 
     [hostView.layer addSublayer:transformationLayer]; 

     CATransform3D transform = CATransform3DMakeTranslation(0, 0, 0); 
     [transformationLayer addSublayer:[self createLayerFromView:source.view transform:transform]]; 

     // transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     // transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
     // if (!goesForward) 
     // { 
     //  transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     //  transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
     //  transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0); 
     //  transform = CATransform3DTranslate(transform, hostView.frame.size.width, 0, 0); 
     // } 
     //  
     // [transformationLayer addSublayer:[self createLayerFromView:dest.view transform:transform]]; 

     if (aDirection == RTOL) 
     { 
      transform = CATransform3DRotate(transform, radians(90), 0, 1, 0); 
      transform = CATransform3DTranslate(transform, CUBESIZE, 0, 0); 
      [transformationLayer addSublayer:[self createLayerFromView:dest.view transform:transform]]; 
     } else { 
      transform = CATransform3DRotate(transform, radians(90), 0, 1, 0); 
      transform = CATransform3DTranslate(transform, CUBESIZE, 0, 0); 
      transform = CATransform3DRotate(transform, radians(90), 0, 1, 0); 
      transform = CATransform3DTranslate(transform, CUBESIZE, 0, 0); 
      transform = CATransform3DRotate(transform, radians(90), 0, 1, 0); 
      transform = CATransform3DTranslate(transform, CUBESIZE, 0, 0); 
      [transformationLayer addSublayer:[self createLayerFromView:dest.view transform:transform]]; 

     } 

    } 

    -(void)moveFrom:(TranDirection)aDirection duration:(float)aDuration 
    { 
     [CATransaction flush]; 
     CABasicAnimation *rotation; 
     CABasicAnimation *translationX; 
     CABasicAnimation *translationZ; 
     CAAnimationGroup *group = [CAAnimationGroup animation]; 
     group.delegate = self; 
     group.duration = aDuration; 

     if (aDirection == RTOL) 
     { 
      translationX   = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"]; 
      translationX.toValue = [NSNumber numberWithFloat:-(CUBE_VERTICAL_WIDTH/2)]; 
      rotation    = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"]; 
      rotation.toValue  = [NSNumber numberWithFloat:radians(-90)]; 
     } else { 
      translationX   = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"]; 
      translationX.toValue = [NSNumber numberWithFloat:(CUBE_VERTICAL_WIDTH/2)]; 
      rotation    = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"]; 
      rotation.toValue  = [NSNumber numberWithFloat:radians(90)] ; 
     } 

     translationZ    = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.z"]; 
     translationZ.toValue  = [NSNumber numberWithFloat:-(CUBE_VERTICAL_WIDTH/2)]; 
     group.animations   = [NSArray arrayWithObjects: rotation, translationX, translationZ, nil]; 
     group.fillMode   = kCAFillModeForwards; 
     group.removedOnCompletion = NO; 
     [transformationLayer addAnimation:group forKey:kAnimationKey]; 
    } 

    - (void)perform:(TranDirection)tdir 
    { 
     [self constructRotationLayer:tdir]; 
     // [self animateWithDuration:2.0f]; 
     [self moveFrom:tdir duration:.4]; 
    } 
+0

nhưng vấn đề của tôi là trong khi đảo ngược hoạt ảnh lật, tôi đang nhận được một khoảng cách giữa các quan điểm – Charan

+0

Tôi phải di chuyển túi đấm lùi và tiến lên trục z vì vậy bất kỳ đề xuất nào về vấn đề này .. – Ankur

Các vấn đề liên quan