2012-04-09 11 views
5

Quindi, sto cercando di implementare un'animazione che è in questa applicazione http://itunes.apple.com/us/app/spg-mobile-app/id312306003?mt=8, che si trova nella prima vistaanimazione 3D - CABasicAnimation e CATransform3D dando divario tra viste

ho implementato animazione per lanciare vista e sto riuscito a animando un lato e quando ho dato la logica inversa per flipping inversa, che sta dando un po 'di spazio tra una vista

qui è il mio codice

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

Così, qui sto chiamando il metodo primaeseguiree qui ho caricato il mio codice totale Here


Questo codice ha funzionato per me un po ', ma ancora ottenere un certo divario, la cosa è la cornice della vista andare e venire vista dovrebbe essere lo stesso

- (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

Il codice di esempio non è completa. Non verrà compilato in quanto mancano i file per RotatingFlipSegue – Abizern

+0

@Charan richiedo anche quella vista. Puoi per favore condividerlo? Sarebbe fantastico se caricassi il tuo codice demo per cedere e condividere con noi. – Siten

risposta

4

Finalmente risolto il mio problema, incasinato con punto di ancoraggio

- (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

Ho fatto lo stesso. Il mio codice di lavoro è sotto. Per favore, ti piace

- (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

ma il mio problema è durante l'inversione dell'animazione flip, sto ottenendo un divario tra le viste – Charan

+0

Devo spostare il sacco da boxe indietro e avanti sull'asse z quindi qualsiasi suggerimento a riguardo. – Ankur

Problemi correlati