2010-10-19 4 views
1

Итак, я прочитал в документации, что использование блоков какCABasicAnimation Проблема

beginAnimation 
commitAnimation 

обескураживают от os4.0.

Так что я пытался заставить свой код работать с помощью CABasicAnimation. Я хочу добиться, чтобы кадр изображения был изменен по размеру уменьшенного размера, где-то внутри моего представления, до положения полной ширины, например. (0, 120, 320, 240) - на моем iPhone.

То, что я до сих пор:

[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]; 

Мой NeXTstep бы сначала попытаться переместить изображение в центральное положение, то масштабировать его до нужного размера. Однако я сомневаюсь, что я правильно это сделаю. Может кто-нибудь прокомментировать мой код/​​подход .... есть ли лучший способ?

ответ

5

Я уверен, что вы решили это сейчас, но в любом случае.

Вам не нужно использовать [CATransaction begin]; и [CATransaction commit]; Самый простой способ, который я нашел для этого, - использовать CAAnimationGroup и добавлять анимации один за другим.

Примером может быть

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"]; 

Есть несколько моментов, хотя. Анимации являются чисто визуальными, поэтому перед запуском анимации установите свой возможный кадр представления.

Вы заметите, что весы заканчиваются на 1, это гарантирует, что вы не получите масштабированного слоя изображения. Вместо этого мы начинаем масштабирование и возвращаем его в нормальное состояние.

Переводы должны выполняться аналогичным образом.

Надеется, что это помогает

+0

Спасибо за это Ричардом. Помните, что если вы скопируете и запустили этот код, вы измените эту строку: CABasicAnimation * scaleY = [CABasicAnimation animationWithKeyPath: @ "transform.scale.x"]; сказать «transform.scale.y» – DoctorG

+0

@Doctor: Исправлено это для него. ;) –

0

Cant использовать

[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]; 
    } 
} 
Смежные вопросы