CABasicAnimation Problem - PullRequest
       15

CABasicAnimation Problem

1 голос
/ 19 октября 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 11 мая 2011

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

Вам не нужно [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, это гарантирует, что вы не получите слой масштабированного изображения.Вместо этого мы начинаем масштабирование и приводим его в нормальное состояние.

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

Надеюсь, это поможет

1 голос
/ 29 августа 2012
//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];
    }
}
0 голосов
/ 11 мая 2011

Не можете использовать

[UIView animateWithDuration:2.0
                        animations:^{ 
                            //animations
                        } 
                        completion:^(BOOL finished){
                           // completion methods
                        }];
...