(笔记)动画

(一)使用UIIamge创建动画
  • 不需要手动释放内存
  • animatedImageNamed方法,会自动去找文件名以ship-anim开头的图片,一一加载
  • 局限性比较大。

    UIImage *img = [ UIImage animatedImageNamed : @"ship-anim" duration : 1 ];
    self . flyImages . image = img;


(二)使用UIIamgeView创建动画
  • 执行完动画需要手动释放内存。
  • 释放图片
  • [self.tomImgsperformSelector:@selector(setAnimationImages:)withObject:nilafterDelay:self.tomImgs.animationDuration];

(三)系统动画 UIView
  • animation方法的option选项:执行动画的方式
  • 1.常规动画属性设置(可以同时选择多个进行设置)
    • UIViewAnimationOptionLayoutSubviews //动画过程中保证子视图跟随运动。
    • UIViewAnimationOptionAllowUserInteraction //动画过程中允许用户交互。
    • UIViewAnimationOptionBeginFromCurrentState //所有视图从当前状态开始运行。
    • UIViewAnimationOptionRepeat//重复运行动画
    • UIViewAnimationOptionAutoreverse //动画运行到结束点后仍然以动画方式回到初始点。
    • UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画时间设置。
    • UIViewAnimationOptionOverrideInheritedCurve //忽略嵌套动画速度设置。
    • UIViewAnimationOptionAllowAnimatedContent //动画过程中重绘视图(注意仅仅适用于转场动画)。
    • UIViewAnimationOptionShowHideTransitionViews //视图切换时直接隐藏旧视图、显示新视图,而不是将旧视图从父视图移除(仅仅适用于转场动画)
    • UIViewAnimationOptionOverrideInheritedOptions  //不继承父动画设置或动画类型。
  • 2.动画速度控制(可从其中选择一个设置)
    • UIViewAnimationOptionCurveEaseInOut //动画先缓慢,然后逐渐加速。
    • UIViewAnimationOptionCurveEaseIn  //动画逐渐变慢。
    • UIViewAnimationOptionCurveEaseOut //动画逐渐加速。
    • UIViewAnimationOptionCurveLinear  //动画匀速执行,默认值。
  • 3.转场类型(仅适用于转场动画设置,可以从中选择一个进行设置,基本动画、关键帧动画不需要设置)
  • 对应的方法:
  • [UIView transitionWithView:待变化的场景duration:动画时间 options:转场动画枚举 animations:block动画代码 completion:nil];
    • UIViewAnimationOptionTransitionNone //没有转场动画效果。
    • UIViewAnimationOptionTransitionFlipFromLeft  //从左侧翻转效果。
    • UIViewAnimationOptionTransitionFlipFromRight //从右侧翻转效果。
    • UIViewAnimationOptionTransitionCurlUp //向后翻页的动画过渡效果。
    • UIViewAnimationOptionTransitionCurlDown  //向前翻页的动画过渡效果。
    • UIViewAnimationOptionTransitionCrossDissolve //旧视图溶解消失显示下一个新视图的效果。
    • UIViewAnimationOptionTransitionFlipFromTop  //从上方翻转效果。
    • UIViewAnimationOptionTransitionFlipFromBottom //从底部翻转效果。


(四)为程序添加音频
  • step1:添加库文件 —— AVFoundation.framework。
  • step2:将音频拖入工程,引入AVFoundation头文件
  • step3:创建音频对象

NSString * path = [[ NSBundle mainBundle ] pathForResource : @"frxz" ofType : @"mp3" ];
NSURL *url = [ NSURL fileURLWithPath:path];
//为了延迟音频对象释放的时间,使用属性(强引用)牵制着它
self . avplay = [ AVPlayer playerWithURL :url];
//播放
[ self . avplay play ];



(五)Core Animation层面的动画

1.CALayer层(显示的基础)
  • UIView的显示功能是依赖底层CALayer实现的
  • 每一个UIView包含一个CALayer对象,修改CALayer会影响表现出来的UIView的外观
  • UIView可以响应用户事件,是因为继承了UIResponder,而CALayer不可以响应用户事件。

2.Layer的使用
  • 重要属性:
    • bounds 大小
    • position 位置
    • anchorPoint 锚点
  • 创建新Layer,并将创建好的layer添加到其他layer中
  • Layer的种类
    • 图片 CALayer
      • 给contents属性赋值
    • 文字 CATextLayer
      • 给string属性赋值
    • 绘图 CAShapeLayer
      • 给path属性赋值

3.获取UIView中的CALayer
  • 通过【self.view.layer】属性,获取

// 获取 myView 中的 CALayer 属性
   
CALayer *layer = self . myView . layer ;
    layer.
backgroundColor = [ UIColor greenColor ]. CGColor ;
   
// 设置圆角的半径
    layer.
cornerRadius = 20 ;
   
// 设置边的颜色
    layer.
borderColor = [ UIColor redColor ]. CGColor ;
   
// 设置边宽度
    layer.
borderWidth = 3 ;
   
   
// 一定要设置   默认是 0 透明 看不见
    layer.
shadowOpacity = 1 ;
   
// 设置阴影边境
    layer.
shadowRadius = 10 ;
   
// 设置阴影颜色
    layer.
shadowColor = [ UIColor blackColor ]. CGColor ;
   
// 设置阴影的偏移量
    layer. shadowOffset = CGSizeMake ( 10 , 10);


4.圆形头像效果
效果图:
                    

// 设置 imageView 中的 layer
   
self . imageView . layer . borderWidth = 3 ;
    self . imageView . layer . borderColor = [ UIColor redColor ]. CGColor;
     //设置圆角的半径为图片长或宽的一半
    self . imageView . layer . cornerRadius = self . imageView . bounds . size . width * 0.5 ;
       //削去圆角以外的部分。
    self . imageView . layer . masksToBounds = YES ;


(六)添加子layer

  CALayer * subLayer = [ CALayer layer ];
    subLayer.
backgroundColor = [ UIColor redColor ]. CGColor ;
    subLayer.
bounds = CGRectMake ( 0 , 0 , 40 , 40 );
    // 设置锚点 取值范围 0~1 自身的一个点。
       //默认是 (0.5 0.5),也就是视图的中心点
    subLayer. anchorPoint = CGPointMake ( 0 , 0 );
   
    // 设置位置 , 自身在 superLayer 中的位置
       //即修改【锚点】在父layer中的位置
    subLayer. position = CGPointMake ( 100 , 100 );
   
   
// 将【子 layer 】添加到【父 layer 】中
    [ self . myView . layer addSublayer :subLayer];


(七) CADisplayLink定时器
  • 严格意义上讲 CADisplayLink 并不是计时器控件, 它是与显示器刷新频率一致的。比如显示的刷新频率是60赫兹, 那么 CADisplayLink 就会每秒钟执行60次。正是因为这个原因所以有时也把 CADisplayLink 当做计时器控件来使用。

@property ( strong , nonatomic ) CADisplayLink* link;

-( CADisplayLink *)link{
    if (! _link) {
       
    // 创建一个执行某方法的定制器
     //rotation:为自定义的方法
   _link = [ CADisplayLink displayLinkWithTarget : self selector : @selector(rotation:)]; 
       
    // 把定时器加到主循环中
   [ _link addToRunLoop :[ NSRunLoop currentRunLoop ] forMode : NSDefaultRunLoopMode];
 
   // 一开始为暂停
    _link . paused = YES;
   
  }   
    return _link ;
}


(八)CAAnimation动画
  • CA的动画,只能施加到CALayer上
  • CA动画与UIView的区别:
    • CA动画是假的,视图看着好像位置改变,但其实数据没有改变
    • UIView动画中,明确改变了视图的位置


//创建基础动画对象
  CABasicAnimation * anim = [ CABasicAnimation animation];
  
    // 设置动画要修改的内容
    // 内容:
    // 位置 position(点)
    //位移 translate
    // 大小 scale
   
// 旋转 rotation
   
// 使用 KVC 为属性赋值,说明要改的属性名是什么
    anim.
keyPath = @"position" ;
   
// 为属性赋值,到达的位置
    anim.
toValue =  [ NSValue valueWithCGPoint : CGPointMake ( 250 , 520 )];
   
// 为属性赋值,起点的的位置
   
//anim.fromValue =  [NSValue valueWithCGPoint:CGPointMake(250, 520)];

   
// 持续时间
    anim.
duration = 2 ;
   
// 执行次数
    anim.
repeatCount = 2 ;
   
   
/** 固定动画结束时 视图的位置 **/
   
// 动画结束时,不要把动画从视图上移除
   
// 保持结束时的状态
    anim.
removedOnCompletion = NO ;
    anim.
fillMode = kCAFillModeForwards ;
    /**
     fillMode的取值:
     kCAFillModeForwards = 当动画结束时, layer 保持动画最后的状态
     kCAFillModeBackwards =
动画开始前,只需要将动画加入一个 layer layer 会立即进入动画的初始状态并等待动画开始
     kCAFillModeBoth =
以上两个动画效果的集合
     kCAFillModeRemoved =
默认值。动画开始前后,动画对 layer 都没有影响。动画结束后, layer 恢复到原来的状态。
    
     */

   
   
// 将动画添加给 layer
    [ self . iamgeView . layer addAnimation :anim forKey : nil ];


(九)关键帧动画

// 创建关键帧动画的对象
   
CAKeyframeAnimation * anim = [ CAKeyframeAnimation animation ];
   
    anim.
keyPath = @"position" ;
   
   
//1. 关键帧,组
    anim.
values = @[
    [
NSValue valueWithCGPoint : CGPointMake ( 100 , 100 )],
    [
NSValue valueWithCGPoint : CGPointMake ( 400 , 100 )],
    [
NSValue valueWithCGPoint : CGPointMake ( 400 , 400 )],
    [
NSValue valueWithCGPoint : CGPointMake ( 100 , 400 )],
    [
NSValue valueWithCGPoint : CGPointMake ( 100 , 100 )]
   
] ;

    //2. 使用贝塞尔对象,绘制矩形,以矩形的四个点作为关键帧顶点运动
    anim. path = [ UIBezierPath bezierPathWithRoundedRect : CGRectMake ( 100 , 100 , 200 , 200 ) cornerRadius : 20 ]. CGPath ;
   
   
// 持续时间
    anim.
duration = 1 ;
   
// 执行次数
    anim.
repeatCount = 1000000000 ;
   
    anim.
removedOnCompletion = NO ;
    anim.
fillMode = kCAFillModeForwards ;
   
    [ self . iamgeView . layer addAnimation :anim forKey : nil ];


(十)组动画
  • 同时设置多个动画效果

// 组动画
-(
void )groupAnimation{
   
// 创建位移的动画
   
CABasicAnimation * positionAnim = [ CABasicAnimation animation ];
    positionAnim.
keyPath = @"position.y" ;
    positionAnim.
toValue = @500 ;
   
// 动画运行时,速度函数 EaseIn 开始快
    positionAnim.
timingFunction = [ CAMediaTimingFunction functionWithName : kCAMediaTimingFunctionEaseIn ];
    
    // 创建一个变形的动画
   
CABasicAnimation * transformAnim = [ CABasicAnimation animationWithKeyPath : @"transform.rotation.y" ];
    transformAnim.
toValue = @( M_PI ) ;
    transformAnim.
timingFunction = [ CAMediaTimingFunction functionWithName : kCAMediaTimingFunctionEaseOut ];
   
   
// 创建动画组
   
CAAnimationGroup * animGroup = [ CAAnimationGroup animation ];
    animGroup.
animations = @[ positionAnim,transformAnim ] ;
    animGroup.
duration = 2 ;
    animGroup.
repeatCount = 10 ;
    animGroup.
removedOnCompletion = NO ;
    animGroup.
fillMode = kCAFillModeForwards ;
   
    [
self . iamgeView . layer addAnimation :animGroup forKey : nil ];
   
}


总结:CAAnimation的子类
  • CABasicAnimation
    • 位移、缩放、旋转
  • CAKeyframeAnimation
  • CAAnimationGroup

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值