ios (一) :翻转动画

项目的任务,需要实现一个类似于下图的翻转动画,图片在翻转的同时,还要进行改变。

目标动画

最开始,直接使用UIView的动画。

代码很简单:

- (void)viewAnimation {

[UIView transitionWithView:_imageView duration:2*actionSeconds options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{

if (_imageView.tag == 101) {

_imageView.image = [UIImage imageNamed:@"logo"];

_imageView.tag = 102;

} else {

_imageView.image = [UIImage imageNamed:@"icon"];

_imageView.tag = 101;

}

}completion:^(BOOL finished) {

[self viewAnimation];

}];

}

但是,这样实现的动画,图片在翻转的时候,背景会变暗。


view动画

这是因为,在翻转的时候,imageView的alpha值会变化。

为了图片背景不变暗,所以决定使用layer层的动画。

代码如下:

- (void)simpleLyerRotation

{

CABasicAnimation* basicAnimation;

basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];

basicAnimation.toValue = [NSNumber numberWithFloat: M_PI ];

basicAnimation.duration = 1.2*actionSeconds;

basicAnimation.cumulative = NO;

basicAnimation.repeatCount = 1;

basicAnimation.fillMode = kCAFillModeForwards;

basicAnimation.removedOnCompletion = NO;

basicAnimation.delegate = self;

[_imageView.layer addAnimation:basicAnimation forKey:@"rotationAnimation"];

[self performSelector:@selector(changeImg) withObject:nil afterDelay:0.6 * actionSeconds];

}

- (void)changeImg

{

if (_imageView.tag == 101) {

_imageView.image = [UIImage imageNamed:@"logo"];

_imageView.tag = 102;

} else {

_imageView.image = [UIImage imageNamed:@"icon"];

_imageView.tag = 101;

}

}

但是,效果有问题,翻转的时候,会转到反面去。


简单layer动画

仔细分析之后,我发现,需要达到的功能是:图片先顺着旋转90°,接着再逆着旋转90°。这样,就不会显示反着的图片。

这样的话,就需要一个连续的动画效果。

使用CABasicAnimation,我无法实现这样的功能。后来,发现可以使用CAKeyframeAnimation,来创建这样的动画效果。

代码如下:

- (void)layerRotation  {

CAKeyframeAnimation *keyAnimation = [CAKeyframeAnimation animation];

// 旋转角度, 其中的value表示图像旋转的最终位置

keyAnimation.values = [NSArray arrayWithObjects:

[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0,1,0)],

[NSValue valueWithCATransform3D:CATransform3DMakeRotation((M_PI/2), 0,1,0)],

[NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0,1,0)],

nil];

keyAnimation.cumulative = NO;

keyAnimation.duration = 1.2 * actionSeconds;

keyAnimation.repeatCount = 1;

keyAnimation.removedOnCompletion = NO;

keyAnimation.delegate = self;

[_imageView.layer addAnimation:keyAnimation forKey:@"transform"];

[self performSelector:@selector(changeImg) withObject:nil afterDelay:0.6 * actionSeconds];

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 12,717评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 10,531评论 5 13
  • Core Animation Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,...
    45b645c5912e阅读 8,178评论 0 21
  • 显式动画 显式动画,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。 属性动画 ...
    清风沐沐阅读 6,130评论 1 5
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 8,381评论 1 23