2012-04-09 2 views
5

Таким образом, я пытаюсь реализовать анимацию, которая находится в этом приложении http://itunes.apple.com/us/app/spg-mobile-app/id312306003?mt=8, который находится в первой точке зрения3D Анимация - CABasicAnimation и CATransform3D давая разрыв между представлениями

Я реализовал анимацию для листать взгляды и я преуспел в анимировать одну сторону, и когда я дал обратную логику для обратного переворачивания, это дает некоторый разрыв между видом

вот мой код

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

Итак, я зову выполнить метод первого и здесь я загрузил мой полный код Here


Этот код работает для меня немного, но все еще получаю некоторый разрыв, вещь рама собирается зрения и приходит вид должен быть таким же

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

Код образца не является полным. Он не будет создан, так как ему не хватает файлов для RotatingFlipSegue – Abizern

+0

@Charan i также требует, чтобы View. Не могли бы вы поделиться им? Было бы здорово, если бы вы загрузили демо-код, чтобы поделиться и поделиться с нами. – Siten

ответ

4

наконец решить мою проблему, перепутался с точкой привязки

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

Я сделал то же самое. Мой рабочий код приведен ниже. Пожалуйста, понравится.

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

, но моя проблема заключается в том, чтобы обратить вспять анимацию флип, я получаю промежуток между видами – Charan

+0

Мне нужно переместить перфорирующую сумку назад и вперед по оси z, поэтому любое предложение в этом отношении .. – Ankur

Смежные вопросы