анимация перекрестного затухания между двумя UIImages в target-c не затухает в первом UIImage - PullRequest
0 голосов
/ 26 июля 2011

Я хочу поменять местами два разных UIImage, но по какой-то причине я не могу понять, что мой первый UIImage остается, когда появляется второй. Вот исходный код моей анимации (он делает гораздо больше, чем просто помутнение, но помеха - моя единственная проблема сейчас). Мне нужно, чтобы все три анимации, перечисленные ниже, были выполнены одновременно.

CGMutablePathRef thePath = CGPathCreateMutable();
CGPathMoveToPoint(thePath,NULL,startPoint.x, startPoint.y);
CGPathAddLineToPoint(thePath, NULL, endPoint.x, endPoint.y);

CAKeyframeAnimation *positionAnimation =[CAKeyframeAnimation animationWithKeyPath:@"position"];
positionAnimation.path=thePath;
positionAnimation.duration=ti_duration;
positionAnimation.repeatCount=0;
positionAnimation.delegate = self;
positionAnimation.autoreverses=NO;
positionAnimation.fillMode=kCAFillModeForwards;
positionAnimation.removedOnCompletion = NO;
[self.layer addAnimation:positionAnimation forKey:s_direction];

CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
crossFade.duration = ti_duration;
crossFade.fromValue = (id)img_startImage.CGImage;
crossFade.toValue = (id)img_transferImage.CGImage;
[self.iv_image.layer addAnimation:crossFade forKey:@"animateContentsToTransferState"];
[self.iv_image setImage:img_transferImage];

CAAnimationGroup *theGroup = [CAAnimationGroup animation];
theGroup.duration = ti_duration;
theGroup.repeatCount = 0;
theGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
theGroup.animations = [NSArray arrayWithObjects:/*positionAnimation,*/ crossFade, nil]; // you can add more

[self.layer addAnimation:theGroup forKey:@"move"];

[UIView beginAnimations:@"changeSize" context:nil];
[UIView setAnimationDuration:duration];
self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.transferSize.width, self.transferSize.height);
[UIView commitAnimations];

Метод анимации, содержащий этот исходный код, находится в подклассе UIView. Этот подкласс содержит несколько UIImages и один UIImageView, в котором содержится отображаемое изображение.

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

Я надеюсь, что кто-то может помочь мне с этим.

Greets Maverick

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Думайте о CAAnimation с как о операциях, применяемых к CALayer. Текущее состояние анимации не изменяет исходное содержимое слоев.

Когда исходное состояние кажется огибающим в конце анимации, это фактически просто удаление анимации, и состояние слоев real снова раскрывается.

Что вам нужно сделать, это зарегистрировать делегата для вашей анимации и изменить фактический self.layer.contents после завершения анимации.

Первый:

crossFade.delegate = self;

Затем реализовать:

- (void)animationDidStop:(CABasicAnimation *)animation finished:(BOOL)flag {
    self.layer.contents = animation.toValue;
}
0 голосов
/ 27 июля 2011

Попробуйте этот код ... У меня это сработало.

-(void)crossFadeImage{

    CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
    crossFade.duration = 2.0;
    crossFade.fromValue  = img1.CGImage;
    crossFade.toValue = img2.CGImage;
    [self.background.layer addAnimation:crossFade forKey:@"animateContents"];
    self.background.image = img2;

}
...