2012-04-09 9 views
5

Also, ich versuche, eine Animation zu implementieren, die http://itunes.apple.com/us/app/spg-mobile-app/id312306003?mt=8 in dieser App ist, die in der ersten Ansicht ist3D-Animation - CABasicAnimation und CATransform3D geben Lücke zwischen den Ansichten

I Animation umgesetzt habe für Ansichten spiegeln, und ich kann mich in eine Seite animieren und wenn ich die umgekehrte Logik für Reverse-Flipping gegeben haben, es ist eine gewisse Lücke zwischen den Ansichten

hier geben, ist mein Code

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

So, hier i-Methode durchführen nenne erste und hier ich meine gesamten Code Here


Dieser Kodex ein bisschen für mich gearbeitet, aber immer noch eine gewisse Lücke hochgeladen bekommen, ist das, was der Rahmen der gehen Ansicht und kommen Ansicht sollte

- (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]; 
} 
gleich sein
+0

Der Beispielcode ist nicht vollständig. Es wird nicht erstellt, da es die Dateien für RotatingFlipSegue – Abizern

+0

@Charan fehlt, die ich auch diese Ansicht benötige. Kannst du es bitte teilen? Es wäre toll, wenn Sie Ihren Demo-Code auf git hochladen und mit uns teilen würden. – Siten

Antwort

4

Bei gelöst letzten mein Problem, verwirrte mit Ankerpunkt nach oben

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

Ich tat das Gleiche. Mein Arbeitscode ist unten. Bitte gefällt es.

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

aber mein Problem ist, während die Flip-Animation umzukehren, bekomme ich eine Lücke zwischen den Ansichten – Charan

+0

Ich muss den Boxsack rückwärts und vorwärts auf der Z-Achse so jeden Vorschlag in dieser Hinsicht bewegen .. – Ankur

Verwandte Themen