我在图像视图上运行常量动画:
[UIView animateWithDuration:dur
delay:curAnim.delay
options:(params)
animations:^{
self.view.layer.opacity = curAnim.opacity;
self.view.center = curAnim.center;
CGAffineTransform tr = CGAffineTransformMakeRotation(curAnim.rotation);
tr = CGAffineTransformScale(tr, curAnim.scale, curAnim.scale);
self.view.transform = tr;
}
completion:^(BOOL finished){
}];
然后,当常量动画正在运行时,我想转换到另一个图像:
-(void)transitionToImage:(UIImage*)image duration:(CGFloat)duration
{
UIImageView* iv = (UIImageView*)self.view;
iv.image = image;
CATransition *transition = [CATransition animation];
transition.duration = duration;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;
[iv.layer addAnimation:transition forKey:@"transition"];
}
然而,当我转换时,现在有2个视图,一个移动而一个不移动,而不是在我的图像视图上发生转换。
我尝试了各种转换方法,但都会产生同样的问题。
我怎么能这样做才能转换并继续当前正在运行的动画?
答案 0 :(得分:3)
对两个动画使用核心动画
CABasicAnimation *posAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
posAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(250, 250)];
posAnimation.fromValue = [NSValue valueWithCGPoint:self.imageView.layer.position];
posAnimation.duration = 3;
posAnimation.fillMode = kCAFillModeForwards;
posAnimation.removedOnCompletion = NO;
[self.imageView.layer addAnimation:posAnimation forKey:nil];
CABasicAnimation *imgAnim = [CABasicAnimation animationWithKeyPath:@"contents"];
imgAnim.fromValue = (id)[UIImage imageNamed:@"icon1"].CGImage;
imgAnim.toValue = (id)[UIImage imageNamed:@"icon2"].CGImage;
imgAnim.duration = 3;
imgAnim.fillMode = kCAFillModeForwards;
imgAnim.removedOnCompletion = NO;
[self.imageView.layer addAnimation:imgAnim forKey:nil];
CoreAnimation(CATransition)并没有真正改变属性。 [UIView animateWithDuration:...]的确如此。所以CATransition并不关心当前的位置。它会在动画开始的位置抓取您的图像,并仅在“presentationLayer”(而不是图层本身)上执行转换,该转换始终位于相同的位置。
<强>更新强>
CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnim.fromValue = @1;
scaleAnim.toValue = @2;
scaleAnim.duration = 3;
scaleAnim.fillMode = kCAFillModeForwards;
scaleAnim.removedOnCompletion = NO;
[self.imageView.layer addAnimation:scaleAnim forKey:nil];
CABasicAnimation *rotAnim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rotAnim.fromValue = @0;
rotAnim.toValue = @(M_PI);
rotAnim.duration = 3;
rotAnim.fillMode = kCAFillModeForwards;
rotAnim.removedOnCompletion = NO;
[self.imageView.layer addAnimation:rotAnim forKey:nil];