iOS动画Animation

1.UIKit层面的动画

  • 帧动画,UIImage实现的动画

1.image动画,用一组image加载为闪图

  let image = UIImage.animatedImage(with: images, duration: 3)

2.ImageView动画

    imageView1.animationImages = images     添加图片到view
    imageView1.animationDuration = 4             循环时间
    imageView1.animationRepeatCount = -1    循环次数 -1重复, 1运行完删除
    imageView1.startAnimating()
imageViewAnimation.gif

3.Timer定时器

通过添加定时器连续调用一个方法来修改视图的 center transform frame alpha bounds 来达到动画的效果

imageDura.gif

匀速动画的实现可以一个公式计算实现

当前值= 开始值+当前帧数 ** (结束值-开始值)/帧率* *动画时长

4.UIView层面的动画

UIView动画是系统为UIView 提供的专门用于控制视图实现的动画的方法

  1. 只需要在动画前设置好视图要修改的视图的起始状态
  2. 选择合适的方法后
  3. 在方法内说明动画结束时视图的状态

不需要关注中间的变化过程,只需要说明视图动画结束是什么样子,系统就会为这个过程自动添加动画

let rect = self.imageView1.frame

    self.imageView1.frame = CGRect(x: -100, y: -100, width: 10, height: 20)
    UIView.animate(withDuration: 5, delay: 1, options: UIViewAnimationOptions.curveEaseInOut,animations: {
            self.imageView1.frame = rect  //动画结束状态
    },completion: { _ in   //动画完成后
        self.imageView1.alpha = 0.3
        UIView.animate(withDuration: 3, animations: { //嵌套
            self.imageView1.alpha = 1
        })
    })
UIViewAnimation.gif
UIViewAnimationOptions
UIViewAnimationOptionLayoutSubviews           //提交动画的时候布局子控件,表示子控件将和父控件一同动画。
UIViewAnimationOptionAllowUserInteraction     //动画时允许用户交流,比如触摸
UIViewAnimationOptionBeginFromCurrentState    //从当前状态开始动画
UIViewAnimationOptionRepeat                   //无限重复动画
UIViewAnimationOptionAutoreverse              //执行反向动画,前提是设置动画无限重复
UIViewAnimationOptionOverrideInheritedDuration//忽略外层动画嵌套的执行时间
UIViewAnimationOptionOverrideInheritedCurve   //忽略外层动画嵌套的时间变化曲线
UIViewAnimationOptionAllowAnimatedContent     //通过改变属性和重绘实现动画效果,如果key没有提交动画将使用快照
UIViewAnimationOptionShowHideTransitionViews  //用显隐的方式替代添加移除图层的动画效果
UIViewAnimationOptionOverrideInheritedOptions //忽略嵌套继承的�选项
时间函数曲线相关
UIViewAnimationOptionCurveEaseInOut           //默认,先慢再快再慢
UIViewAnimationOptionCurveEaseIn              //越来越快
UIViewAnimationOptionCurveEaseOut             //越爱越慢
UIViewAnimationOptionCurveLinear              //匀速
转场动画相关
UIViewAnimationOptionTransitionNone           //无转场动画
UIViewAnimationOptionTransitionFlipFromLeft   //转场从左翻转
UIViewAnimationOptionTransitionFlipFromRight  //转场从右翻转
UIViewAnimationOptionTransitionCurlUp         //上卷转场
UIViewAnimationOptionTransitionCurlDown       //下卷转场
UIViewAnimationOptionTransitionCrossDissolve  //转场交叉消失
UIViewAnimationOptionTransitionFlipFromTop    //转场从上翻转
UIViewAnimationOptionTransitionFlipFromBottom //转场从下翻转

最后一组转场动画一般是使用在下面这个方法中

 UIView.transition(from: self.view, to: self.imageView2, duration: 3, options: UIViewAnimationOptions.transitionFlipFromBottom, completion: nil)

效果:


UIImageTanslation.gif

2.CoreAnimation层面的动画

基础CALayer
  1. UIView核心显示功能就是依靠CALayer实现,每一个UIView都包含了一个CALayer对象,修改了CALayer,会影响表现出来的UIView的外观
  2. UIViewCALayer最大的不同在于Layer是不能够响应事件的,UIView由于继承了UIResponder,所以还能够响应用户事件
shadowColor       阴影颜色 
shadowOpacity     阴影透明
shadowOffset      阴影偏移量
shadowPath        阴影路径
shadowRadius      阴影半径
borderColor       边界颜色
borderWidth       边界宽度
backgroundColor   背景色
cornerRadius      拐角半径
Position          位置 (是锚点在父视图中所处的位置)
anchorPoint       锚点 (指的是图层中固定的一点,对于图层的操作旋转,缩放都是相对于这一固定点)
Position 与 anchorPoint 一个对于本图层和一个对于父视图在空间上相对重合的一点,修改一个不会影响另一个
  • 例1: 切圆形图片
        imageView2.layer.borderWidth = 2
        imageView2.layer.borderColor = UIColor.red.cgColor
        imageView2.layer.cornerRadius = imageView2.frame.size.width * 0.5
        imageView2.layer.masksToBounds = true
Paste_Image.png
  • 例2: CATextLayer 制作水印
        let tlayer = CATextLayer()
        tlayer.string = "这是一条CATextLayer水印"
        tlayer.fontSize = 15
        tlayer.foregroundColor = UIColor.white.cgColor
        tlayer.backgroundColor = UIColor.black.cgColor
        tlayer.position = CGPoint(x: 200, y: 250)
        tlayer.bounds = CGRect(x: 0, y: 0, width: 250, height: 30)
        tlayer.opacity = 0.3
        imageView2.layer.addSublayer(tlayer)
Paste_Image.png

.CAAnimation动画

CALayer很多属性都有隐式动画,修改该属性会有动画效果(属性备注中有animation)如:

Paste_Image.png

CAAnimation动画只是一个假象 而UIView的animation则会改变视图的数据

1.CABasicAnimation 基础动画

只要设置动画起始状态和KeyPath与一些属性即可

你只需要给出两个状态,一个初始状态一个终止状态,系统自动为你将中间的动画补全

其中有两个主要属性fromValue开始值 和 toValue 最终值

    let basicAnimation = CABasicAnimation()
    basicAnimation.keyPath = "position.y" //CALayer 中属性的备注 最后只要有animation就可以支持动画
    basicAnimation.toValue = 11
    basicAnimation.duration = 5
    basicAnimation.fillMode = kCAFillModeForwards
    basicAnimation.isRemovedOnCompletion = false //在动画结束的位置不回到原点
    self.imageView1.layer.add(basicAnimation, forKey: nil) 注:把动画加入layer后 再修改basicAnimation 是没有效果的
CABasicAnimation.gif

2.CAKeyFrameAnimation 关键帧动画

CAKeyFrameAnimation 可以通过Value属性记录中间变化的每一个细节,CABasicAnimation相当于是只有两个关键帧的动画

CAKeyFrameAnimation 最重要的效果就是可以自定义动画路径,通过Path属性记录

   let keyAnimation = CAKeyframeAnimation()
    keyAnimation.keyPath = "position"  //keyPath 必须为position, transform, opacity 其中的一个
    keyAnimation.path = UIBezierPath(rect: CGRect(x: 30, y: 30, width: 300, height: 300)).cgPath  //按照路径运动
    keyAnimation.duration = 6
    keyAnimation.repeatCount = 6
    keyAnimation.isRemovedOnCompletion = false //不回到原点
    keyAnimation.fillMode = kCAFillModeForwards
    imageView1.layer.add(keyAnimation, forKey: nil)
CAKeyFrameAnimation.gif

3.CAAnimationGroup 动画组

可以创建动画组来管理所有动画,同意设置动画时长,添加到视图的Layer

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,461评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,092评论 5 13
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 3,076评论 1 23
  • 本文转载自:http://www.cocoachina.com/ios/20150105/10812.html 为...
    idiot_lin阅读 1,246评论 0 1
  • 转载:http://www.jianshu.com/p/32fcadd12108 每个UIView有一个伙伴称为l...
    F麦子阅读 6,153评论 0 13