我们先来看一下今天我们要实现的效果,今天实现的效果用第一篇View Animations能实现相同效果。

动画由书籍《iOS Animations by tutorials》提供,我只是一个复述者

哦~先来看一下Layer是什么吧:

比较通俗的来说,CALayer就是UIView的视图层,你所看到的UIView,其实是UIView的layer。这么说吧,CALayer就是树叶的叶绿素,和叶绿素不同的就是,CALayer更加的“单纯”,我们知道叶绿素是包括很多基质的,而CALayer仅仅是代表了你能看到的一切。


我们今天把所有的重点都放在动画的编写上,默认有swift基础 如果你观察都仔细的话,你会发现,背景上的云是渐入的,也就是透明度由0到1,当然这个用我们前面学的UIViewAnimation是很容易实现的,那么用CALayer如何实现呢,看下面的代码:

  1. //1
  2. let fadeIn = CABasicAnimation(keyPath: "opacity")
  3. //2
  4. fadeIn.fromValue = 0.0
  5. //3
  6. fadeIn.toValue = 1.0
  7. //4
  8. fadeIn.duration = 0.5
  9. //5
  10. fadeIn.fillMode = kCAFillModeBackwards
  11. //6
  12. fadeIn.beginTime = CACurrentMediaTime() + 0.5
  13. cloud1.layer.addAnimation(fadeIn, forKey: nil)
  14. fadeIn.beginTime = CACurrentMediaTime() + 0.7
  15. cloud2.layer.addAnimation(fadeIn, forKey: nil)
  16. fadeIn.beginTime = CACurrentMediaTime() + 0.9
  17. cloud3.layer.addAnimation(fadeIn, forKey: nil)
  18. fadeIn.beginTime = CACurrentMediaTime() + 1.1
  19. cloud4.layer.addAnimation(fadeIn, forKey: nil)

很明显我们是给四朵云的layer添加了动画,然后实现了渐入的效果。

  • 1、这句话声明了一个 CABasicAnimation,注意到里面填写的参数没,填的是 opacity,就是透明度的意思,这里头还能填写很多其他值,比如position,当然这些我们后面都会讲的。
  • 2、我们对动画的初始值进行设定,也就是透明度最开始为0.
  • 3、我们对动画的最终值进行设定,也就是透明度为1。
  • 4、动画持续时间,我们设定为0.5秒。和前面三句合起来,就表达了这么一个意思:这个动画是对对象的透明度进行改变,在0.5秒内,透明度从0变化为1.
  • 5、我们给fillMode属性填的值是kCAFillModeBackwards,那么kCAFillModeBackwards这个值有什么用呢,这个属性可以显示对象的frame,我们可以把这一句注释以后运行程序来看一下效果,我们会发现,在进行动画之前,云朵任然可见,而这显然是一个BUG,如何解决这个BUG呢,其实方法很多,比如我们可以讲云朵的透明度都设置为0,然后计算好动画时间,当动画结束以后将云朵的透明度设置为1,这样做当然可以实现相同的效果,但是这样做实在是~~~~太不优雅了,还有一种做法就是添加fillMode属性,kCAFillModeBackwards的意思是显示动画的初始状态,同时还有其他两个值kCAFillModeForwards可以显示对象动画之后的效果,kCAFillModeBoth则是兼顾以上两个效果。
  • 6、这个属性很好解释,每一朵云朵的动画并不是同时进行的,那么我们就给云朵设定开始的时间,这个属性和我们前面说过的UIViewAnimation的delay这个参数比较类似。

以上内容实现了云朵的渐入动画。

如果对我已经说过好几遍的UIViewAniamtion有疑问的话,请自行阅读本人前面的文章,觉得不错的话请关注本人,再点一个喜欢吧,亲~~


接下来实现的是标题、UsernamePassWord有screen外由左向右移动到屏幕中心的动画,直接上代码:

  1. //1
  2. let flyRight = CABasicAnimation(keyPath: "position.x")
  3. flyRight.toValue = view.bounds.size.width/2
  4. flyRight.fromValue = -view.bounds.size.width/2
  5. flyRight.duration = 0.5
  6. heading.layer.addAnimation(flyRight, forKey: nil)
  7. //2
  8. flyRight.beginTime = CACurrentMediaTime() + 0.3
  9. flyRight.fillMode = kCAFillModeBackwards
  10. username.layer.addAnimation(flyRight, forKey: nil)
  11. flyRight.beginTime = CACurrentMediaTime() + 0.4
  12. password.layer.addAnimation(flyRight, forKey: nil)
  • //1 通过对云朵动画的讲解,相信其实我们已经能够大致看懂这一段代码了,和上面唯一不同的就是,我们这里创建的CABasicAnimation的动画对象为"position.x"fromvaluetoVaule相信也不用进行太多讲解,值得一题的是我们的值指的是对象的center.x,而不是左上角。
  • //2 对username延迟0.3秒进行。同时同样设定 flyRight.fillMode = kCAFillModeBackwards

是不是很简单呢,是的~


Log in 按钮的动画,上代码:

  1. UIView.animateWithDuration(0.5, delay: 0.5, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: nil, animations: {
  2. self.loginButton.center.y -= 30.0
  3. self.loginButton.alpha = 1.0
  4. }, completion: nil)

对于这一段代码的解释在这里,说的十分详细,作者也长得很帅,看头像就看得出来:http://www.jianshu.com/p/bd7bf438b288喜欢的话请关注他。


我们还发现云朵是不断的移动的,继续上代码:

  1. func animateCloud(cloud: UIImageView) {
  2. let cloudSpeed = 60.0 / view.frame.size.width
  3. let duration = (view.frame.size.width - cloud.frame.origin.x) * cloudSpeed
  4. UIView.animateWithDuration(NSTimeInterval(duration), delay: 0.0, options: .CurveLinear, animations: {
  5. cloud.frame.origin.x = self.view.frame.size.width
  6. }, completion: {_ in
  7. cloud.frame.origin.x = -cloud.frame.size.width
  8. self.animateCloud(cloud)
  9. })
  10. }

> 解释请参考Log in按钮的解释。-------------先就只剩下点击**Log in**按钮以后的动画了,我们先来看一下发生什么了,当我们点击按钮以后,按钮duang~的一下蹦到下面了,同时颜色变了,圆角变大了,然后添加了一个活动指示器。 上代码:

  1. @IBAction func login() {
  2. //1
  3. UIView.animateWithDuration(1.5, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 0.0, options: nil, animations: {
  4. self.loginButton.bounds.size.width += 80.0
  5. }, completion: nil)
  6. //2
  7. UIView.animateWithDuration(0.33, delay: 0.0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: nil, animations: {
  8. self.loginButton.center.y += 60.0
  9. //3
  10. self.spinner.center = CGPoint(x: 40.0, y: self.loginButton.frame.size.height/2)
  11. self.spinner.alpha = 1.0
  12. }, completion: {_ in
  13. //4
  14. self.showMessage(index: 0)
  15. })
  16. //5
  17. let tintColor = UIColor(red: 0.85, green: 0.83, blue: 0.45, alpha: 1.0)
  18. tintBackgroundColor(layer: loginButton.layer, toColor: tintColor)
  19. //6
  20. roundCorners(layer: loginButton.layer, toRadius: 25.0)
  21. }

这一段就厉害了,因为这一段特别的长。

  • 1、duang~的一下按钮变长了。
  • 2、duang~的一下按钮下移了。
  • 3、添加活动指示器。
  • 4、添加message这个后面再说。
  • 5、调用tintBackgroundColor方法,改变颜色,这是tintBackgroundColor方法的代码:
    1. func tintBackgroundColor(#layer: CALayer, #toColor: UIColor) { let tint = CABasicAnimation(keyPath: "backgroundColor") tint.fromValue = layer.backgroundColor layer.backgroundColor = toColor.CGColor tint.toValue = toColor.CGColor tint.duration = 1.0 tint.fillMode = kCAFillModeBoth layer.addAnimation(tint, forKey: nil) }

    其实这个方法和前面的CABasicgroundColor大体是相同的,我们先把颜色改变成我们需要变成的颜色,然后执行动画。

  • 6、增大圆角的动画
    1. func roundCorners(#layer: CALayer, #toRadius: CGFloat) { let round = CABasicAnimation(keyPath: "cornerRadius") round.fromValue = layer.cornerRadius layer.cornerRadius = toRadius round.toValue = toRadius round.duration = 0.33 layer.addAnimation(round, forKey: nil) }

    这个实现的方法大体是上面改变颜色的思想是一模一样的。也是先改变圆角,然后执行动画,最后显示的会是你一开始设定的圆角。


现在整个动画就只剩下了那个message的动画,和message的动画结束以后,Log in按钮弹回的动画,而Log in按钮弹回的动画和前面刚说过的按钮弹下是一模一样的,只是相反而已。我们来看一下message的动画:

  1. func removeMessage(#index: Int) {
  2. UIView.animateWithDuration(0.33, delay: 0.0, options: nil, animations: {
  3. self.status.center.x += self.view.frame.size.width
  4. }, completion: {_ in
  5. self.status.hidden = true
  6. self.status.center = self.statusPosition
  7. self.showMessage(index: index+1)
  8. })
  9. }
  10. func resetForm() {
  11. UIView.transitionWithView(status, duration: 0.2, options: .TransitionFlipFromTop, animations: {
  12. self.status.hidden = true
  13. self.status.center = self.statusPosition
  14. }, completion: nil)
  15. UIView.animateWithDuration(0.2, delay: 0.0, options: nil, animations: {
  16. self.spinner.center = CGPoint(x: -20.0, y: 16.0)
  17. self.spinner.alpha = 0.0
  18. self.loginButton.bounds.size.width -= 80.0
  19. self.loginButton.center.y -= 60.0
  20. }, completion: {_ in
  21. let tintColor = UIColor(red: 0.63, green: 0.84, blue: 0.35, alpha: 1.0)
  22. tintBackgroundColor(layer: self.loginButton.layer, toColor: tintColor)
  23. roundCorners(layer: self.loginButton.layer, toRadius: 10.0)
  24. })
  25. }

iOS动画——Layer Animations的更多相关文章

  1. IOS UIVIEW layer动画 总结(转)

    转发自:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/16306_12.html   IOS UIVIEW layer动画 总结, ...

  2. iOS Programming Controlling Animations 动画

    iOS Programming Controlling Animations 动画 The word "animation" is derived from a Latin wor ...

  3. (转)iOS动画Core Animation

    文章转载:http://blog.sina.com.cn/s/blog_7b9d64af0101b8nh.html 在iOS中动画实现技术主要是:Core Animation. Core Animat ...

  4. IOS动画总结

    IOS动画总结   一.基本方式:使用UIView类的UIViewAnimation扩展 + (void)beginAnimations:(NSString *)animationID context ...

  5. iOS 动画篇 (二) CAShapeLayer与CoreAnimation结合使用

    接上一篇博客 iOS 动画篇(一) Core Animation CAShapeLayer是CALayer的一个子类,使用这个类能够很轻易实现曲线的动画. 先来一个折线动画效果: 示例代码: //1. ...

  6. IOS动画(Core Animation)总结 (参考多方文章)

    一.简介 iOS 动画主要是指Core Animation框架.官方使用文档地址为:Core Animation Guide. Core Animation是IOS和OS X平台上负责图形渲染与动画的 ...

  7. iOS动画学习

    学习一下动画,感谢以下大神的文章:    UIView:基础动画.关键帧动画.转场动画 Core Animation :基础动画,关键帧动画,动画组,转场动画,逐帧动画 CALayer :CALaye ...

  8. iOS动画-从UIView到Core Animation

    首先,介绍一下UIView相关的动画. UIView普通动画: [UIView beginAnimations: context:]; [UIView commitAnimations]; 动画属性设 ...

  9. 简析iOS动画原理及实现——Core Animation

    本文转载至 http://www.tuicool.com/articles/e2qaYjA 原文  https://tech.imdada.cn/2016/06/21/ios-core-animati ...

随机推荐

  1. Spring入门第十二课

    Bean的配置方法 通过工厂方法(静态工厂方法&实例工厂方法),FactoryBean 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户 ...

  2. mui 关闭当前窗口

    在提交表单的时候,我们都需要关闭表单.需要关闭当前打开的窗口. bit.alert('提交成功' + (result.category.needAudit ? ",请耐心等待管理员审核信息后 ...

  3. 数据库路由中间件MyCat - 源代码篇(3)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2. 前端连接建立与认证 Title:MySql连接建立以及认证过程client->MySql:1.T ...

  4. js call apply bind

    call.apply.bindcat.call(dog, a, b) == cat.apply(dog, [a, b]) == (cat.bind(dog, a, b))() 1.作用 改变函数内的t ...

  5. 2014-11-2 NOIP模拟赛1

    Noip2009 团结模拟赛如题目理解困难,请自行阅读或参考样例.内存限制均为 256MB,时间限制均为 1s.出题人不会 故意 在题目中设置陷阱,但请自己注意程序的正确性.IO 文件名(.in/.o ...

  6. React入门看这篇就够了

    摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所有. React 背景介绍 React 入门实例教程 React 起源于 ...

  7. Java基础--环境配置、简介

    一.环境配置 1.傻瓜式安装JDK,若提示安装JRE,将其置于JDK同一安装目录即可. 2.配置JAVA_HOME, 指向JDK的安装目录.比如 JAVA_HOME  = %JDK安装目录% 3.配置 ...

  8. nginx反向代理解决跨域问题,使本地调试更方便

    我们可能都会遇到一个这样的问题,线上环境是https://...,本地启动了项目,域名是localhost:8000等,本地想要访问线上的接口,直接在本地调试,却提示跨域,这个时候我们可以配置ngin ...

  9. 77%的Linux运维都不懂的内核问题

    前言 之前在实习时,听了 OOM 的分享之后,就对 Linux 内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟,所以经过一个一段时间的积累,对内核内存有一定了解之后, ...

  10. phpstorm使用

    生成注释快捷键/**+enter 注释快捷键ctrl+/