2010-10-19 21 views
1

Alors, je l'ai lu dans la documentation, que l'utilisation de blocs commeCABasicAnimation Problème

beginAnimation 
commitAnimation 

est déconseillé de os4.0.

J'ai donc essayé de faire fonctionner mon code en utilisant CABasicAnimation. Je veux réaliser, que l'image d'une image est redimensionnée à partir de sa taille de vignette, quelque part dans ma vue, à une position pleine largeur, par exemple. (0, 120, 320, 240) - sur mon iPhone.

Ce que j'ai jusqu'à présent:

[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat:1.0] forKey:kCATransactionAnimationDuration]; 

CABasicAnimation *scalingAnimation; 
scalingAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
scalingAnimation.duration=1.0/2; 
scalingAnimation.autoreverses=YES; 
scalingAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
scalingAnimation.fromValue=[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]; 
scalingAnimation.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeScale(4, 4, 1)]; 

[b.layer addAnimation:scalingAnimation forKey:@"scaling"]; 

[CATransaction commit]; 

Mon nextstep serait d'abord essayer de déplacer l'image vers une position centrée échelle puis à la bonne taille. Cependant, je doute que je le fasse de la bonne façon. Quelqu'un peut-il commenter mon code/approche ... y a-t-il un meilleur moyen?

Répondre

5

Suis assez sûr que vous avez résolu cela maintenant, mais dans tous les cas.

Vous ne devriez pas avoir besoin de démarrer [CATransaction]; et [validation de CATransaction]; Le moyen le plus simple que j'ai trouvé pour faire ce genre de chose est d'utiliser CAAnimationGroup et d'ajouter les animations une par une.

Un exemple serait

CABasicAnimation *scaleX = [CABasicAnimation animationWithKeyPath:@"transform.scale.x"]; 
//this is not used, as the group provides the duration 
scaleX.duration = duration; 
scaleX.autoreverses = NO; 

scaleX.toValue = [NSNumber numberWithFloat:1.0]; 
scaleX.fromValue = [NSNumber numberWithFloat:scaleFrom]; 
scaleX.fillMode = kCAFillModeForwards; 
scaleX.removedOnCompletion = NO; 

CABasicAnimation *scaleY = [CABasicAnimation animationWithKeyPath:@"transform.scale.y"]; 
//this is not used, as the group provides the duration 
scaleY.duration = duration; 
scaleY.autoreverses = NO; 

scaleY.toValue = [NSNumber numberWithFloat:1.0]; 
scaleY.fromValue = [NSNumber numberWithFloat:scaleFrom]; 
scaleY.fillMode = kCAFillModeForwards; 
scaleY.removedOnCompletion = NO; 

//add in the translation animations 

NSMutableArray* animationsArray = [NSMutableArray arrayWithObjects:scaleX, 
                    scaleY, 
//and any other animations you want in the group 
             nil]; 

CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; 
animationGroup.duration = 1.0/2; 
animationGroup.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn]; 
animationGroup.animations = animationsArray; 
animationGroup.delegate = self; 
animationGroup.removedOnCompletion = YES; 
animationGroup.fillMode = kCAFillModeForwards; 
[animationGroup setValue:@"imageTransform" forKey:@"AnimationName"]; 
[b.layer addAnimation:animationGroup forKey:@"imageTransform"]; 

Il y a quelques trucs bien. Les animations sont purement visuelles, donc avant d'exécuter les animations, définissez votre cadre de vue éventuel.

Vous remarquerez que les échelles se terminent à 1, ceci afin de s'assurer que vous ne vous retrouvez pas avec une couche d'image mise à l'échelle. Au lieu de cela, nous commençons à l'échelle et le ramener à la normale.

Les traductions doivent être effectuées de la même manière.

Hope this helps

+0

Merci pour ce Richard. Une note, assurez-vous que si vous copiez et passez ce code, vous modifiez cette ligne: CABasicAnimation * scaleY = [CABasicAnimation animationWithKeyPath: @ "transform.scale.x"]; dire "transform.scale.y" – DoctorG

+0

@Doctor: Correction de cela pour lui. ;) –

0

Cant vous utilisez

[UIView animateWithDuration:2.0 
         animations:^{ 
          //animations 
         } 
         completion:^(BOOL finished){ 
          // completion methods 
         }]; 
1
//in Event Method Copy Below code to place the image to the center 

    CABasicAnimation* positionAnimation; 
    positionAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
    positionAnimation.fromValue = [NSValue valueWithCGPoint:imageView.layer.position]; 
    positionAnimation.toValue = [NSValue valueWithCGPoint:centerPointofView]; 
    positionAnimation.duration = 2.0; 
    positionAnimation.fillMode = kCAFillModeForwards; 
    positionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    positionAnimation.removedOnCompletion = NO; 
    positionAnimation.delegate = self; 
    [imageView.layer addAnimation:positionAnimation forKey:@"positionAnimation"]; 

// For Scale After image is in center copy below code 

    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{ 
    CAAnimation *animation = [imageView.layer animationForKey:@"positionAnimation"]; 
    if (animation == theAnimation) 
    { 
     CABasicAnimation* scaleAnimation; 
     scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     scaleAnimation.fromValue = [NSNumber numberWithFloat:1]; 
     scaleAnimation.toValue = [NSNumber numberWithFloat:4.0]; 
     scaleAnimation.duration = 2.2; 
     scaleAnimation.fillMode = kCAFillModeForwards; 
     scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
     scaleAnimation.removedOnCompletion = NO; 
     scaleAnimation.delegate = self; 
     [imageView.layer addAnimation:scaleAnimation forKey:@"scaleAnimation"]; 
    } 
    else 
    { 
     //if you want changes to image should remain forever 
     //place your code for scale & transform here 
     .................... 
     //now simple remove animation from layer 
     [imageView.layer removeAllAnimations]; 
    } 
}