你的位置:首页 > 操作系统

[操作系统]核心动画——动画组


之前介绍了核心动画之弹簧动画,有关于核心动画的结构图大家都还记得吧

所以说动画组属于核心动画,它的初始化和核心动画初始化的方法一样。那么我就简单的介绍一下动画组

动画组:CAAnimationGroup 可以让动画同时执行

动画组中设置的时间控制类属性会影响到动画组内部动画的时间控制类属性

在动画组中去统一设置媒体时间控制类

 

 媒体控制时间的属性

     1.CAMediaTiming媒体时间类协议

     核心动画关于时间类的控制 是遵守了CAMediaTiming中的协议内容

     1.beginTime 动画开始的时间 默认为0

     2.duration 动画的持续时间 默认为0 持续时间 受速度的影响 实际的动画完成时间 = 持续时间/速度

     3.speed 动画播放的速度 默认为1 速度设置成0 可以暂停动画

     speed 2秒  duration 60秒 动画真正播放完成的时间 30秒

     4.timeOffset 动画播放时间的偏移量

     5.repeatCount 动画的循环次数 默认是0 只播放一次

     6.repeatDuration 动画循环的持续时间  只能设置其中的一个属性  repeatCount/repeatDuration

     7.autoreverses  是否以动画的形式 返回到播放之前的状态

     8.fillMode 设置当前对象在非活动时间段的状态

     要想fillMode有效 需设置removedOnCompletion = NO

     kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态

     kCAFillModeBackwards 立即进入动画的初始状态并等待动画开始

     kCAFillModeBoth 动画加入后开始之前 layer处于动画初始状态 动画结束后layer保持动画最后的状态

     kCAFillModeRemoved 默认值 动画结束后 layer会恢复到之前的状态

 

 动画组主要的属性介绍:

    animations 动画的数组 各种动画

 

具体操作如下:

#import "ViewController.h"@interface ViewController ()//花瓣@property (nonatomic, strong) CALayer *petalLayer;//背景@property (nonatomic, strong) CALayer *layer;@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  self.view.backgroundColor = [UIColor blackColor];  [self.view.layer addSublayer:self.layer];  [self.view.layer addSublayer:self.petalLayer];  }//点击掉落 让图层移动的动画 返回的是:移动的动画 endPoint:终点- (CAKeyframeAnimation *)move:(CGPoint)endPoint{  CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"position"];  UIBezierPath *path = [UIBezierPath bezierPath];  //设置起始点  [path moveToPoint:self.petalLayer.position];  //画曲线的方法addCurveToPoint:终点 controlPoint1:<#(CGPoint)#> controlPoint2:<#(CGPoint)#>  [path addCurveToPoint:endPoint controlPoint1:CGPointMake(50, 150) controlPoint2:CGPointMake(300, 250)];  keyFrame.path = path.CGPath;  //节奏动画不是匀速 kCAAnimationPaced  keyFrame.calculationMode = kCAAnimationCubicPaced;  return keyFrame;}/* 旋转动画 1.使用基础动画,其中的一个变化 2.选择哪一个属性transform.rotation.z 可以通过改变animationWithKeyPath来改变动画的属性:   transform.scale = 比例转换   transform.scale.x   transform.scale.y   transform.rotation.z   opacity = 透明度   zPosition   backgroundColor 背景颜色   cornerRadius 柺角   borderWidth 边框的宽度   bounds   contents 内容   contentsRect   frame   hidden   masksToBounds   position   shadowColor   shadowOffset   shadowOpacity   shadowRadius *///旋转动画 让花版掉落的时候自动旋转- (CABasicAnimation *)rotation{  CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];  //M_PI = 3.1415926....  //M_PI_2 = 一半  M_PI_4就是四分之一  animation.fromValue = @(M_PI_4);  animation.toValue = @(M_PI_4*4);  //一直在旋转  //animation.repeatCount = HUGE;  //以动画的形式让他回去  //animation.autoreverses = YES;  return animation;}//花瓣掉落的时候让它慢慢放大 放大动画- (CABasicAnimation *)moveToBig{    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];  animation.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.petalLayer.bounds.size.width, self.petalLayer.bounds.size.height)];  animation.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.petalLayer.bounds.size.width*1.3, self.petalLayer.bounds.size.height*1.3)];  return animation;}- (void)animationGroup:(CGPoint)endPoint{  //初始化  CAAnimationGroup *group = [CAAnimationGroup animation];  //把想要同时运行的动画添加到动画组中  group.animations = @[[self rotation],[self move:endPoint],[self moveToBig]];  //动画组完成的整体时间  group.duration = 5;  //不想让花瓣掉落停止时回到原来的位置 设置它的fillMode  group.removedOnCompletion = NO;  group.fillMode = kCAFillModeBoth;  [self.petalLayer addAnimation:group forKey:@""];  }- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    [self animationGroup:[[touches anyObject] locationInView:self.view]];}- (CALayer *)petalLayer{  if (_petalLayer) {    return _petalLayer;  }  _petalLayer = [CALayer layer];  _petalLayer.position = CGPointMake(self.view.center.x, 50);  UIImage *image =[UIImage imageNamed:@"2"];  _petalLayer.bounds = CGRectMake(0, 0, image.size.width, image.size.height);  _petalLayer.contents = (id)image.CGImage;    return _petalLayer;}- (CALayer *)layer{  if (_layer) {    return _layer;  }  _layer = [CALayer layer];  _layer.position = CGPointMake(self.view.center.x, self.view.center.y+100);  UIImage *image =[UIImage imageNamed:@"4"];  _layer.bounds = CGRectMake(0, 0, image.size.width/2, image.size.height/2);  _layer.contents = (id)image.CGImage;    return _layer;}@end

效果如下: