Swift - 动画效果的实现

 
在iOS中,实现动画有两种方法。一个是统一的animateWithDuration,另一个是组合出现的beginAnimations和commitAnimations。这三个方法都是类方法。

 
一,使用animateWithDuration来实现动画
 
(1)此方法共有5个参数:
  • duration:动画从开始到结束的持续时间,单位是秒
  • delay:动画开始前等待的时间
  • options:动画执行的选项。里面可以设置动画的效果。可以使用UIViewAnimationOptions类提供的各种预置效果
  • anmations:动画效果的代码块
  • completion:动画执行完毕后执行的代码块

(2)UIView支持动画效果的属性

  • frame:此属性包含一个矩形,即边框矩形,此值确定了当前视图在其父视图坐标系中的位置与尺寸
  • bounds:也是矩形,边界矩形,它指的是视图在其自己的坐标系中的位置和尺寸,左上角坐标永远是(0,0)
  • center:确定视图的中心点在其父视图坐标系中的位置坐标。即定义当前视图在父视图中的位置
  • alpha:视图的透明度。(但视图完全透明时,不能响应触摸消息)
  • backgroundColor:背景色
  • transform:这是一种3×3的变化矩阵。通过这个矩阵我们可以对一个坐标系统进行缩放、平移、旋转以及这两者的任意组操作。

(3)Transform(变化矩阵)的四个常用的变换方法

  • CGAffineTransformMake():返回变换矩阵
  • CGAffineTransformMakeTranslation():返回平移变换矩阵
  • CGAffineTransformMakeScale():返回缩放变换矩阵
  • CGAffineTransformMakeRotation():返回旋转变换矩阵

(4)样例1:方块初始缩小为原始尺寸1/10。在1秒的动画中复原到完整大小,同时还伴随旋转效果。

  
 

 import UIKit

 class ViewController: UIViewController {

     //游戏方格维度
     var dimension:Int =
     //数字格子的宽度
     var width:CGFloat =
     //格子与格子的间距
     var padding:CGFloat = 

     //保存背景图数据
     var backgrounds:Array<UIView>!

     override func viewDidLoad()
     {
         super.viewDidLoad()
         self.backgrounds = Array<UIView>()
         setupGameMap()
         playAnimation()
     }

     func setupGameMap()
     {
         var x:CGFloat =
         var y:CGFloat = 

         ..<dimension
         {
             println(i)
             y =
             ..<dimension
             {
                 //初始化视图
                 var background = UIView(frame:CGRectMake(x, y, width, width))
                 background.backgroundColor = UIColor.darkGrayColor()
                 self.view.addSubview(background)
                 //将视图保存起来,以备后用
                 backgrounds.append(background)
                 y += padding + width
             }
             x += padding+width
         }
     }

     func playAnimation()
     {
         for tile in backgrounds{
             //先将数字块大小置为原始尺寸的 1/10
             tile.layer.setAffineTransform(CGAffineTransformMakeScale(0.1,0.1))

             //设置动画效果,动画时间长度 1 秒。
             UIView.animateWithDuration(, delay:0.01,
                 options:UIViewAnimationOptions.TransitionNone, animations:
                 {
                     ()-> Void in
                     //在动画中,数字块有一个角度的旋转。
                     tile.layer.setAffineTransform(CGAffineTransformMakeRotation())
                 },
                 completion:{
                     (finished:Bool) -> Void in
                     UIView.animateWithDuration(, animations:{
                         ()-> Void in
                         //完成动画时,数字块复原
                         tile.layer.setAffineTransform(CGAffineTransformIdentity)
                     })
             })
         }
     }

     override func didReceiveMemoryWarning() {
         super.didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
 }

(5)样例2:只有从小变大的效果

 
 func playAnimation()
 {
     for tile in backgrounds{
         //先将数字块大小置为原始尺寸的 1/10
         tile.layer.setAffineTransform(CGAffineTransformMakeScale(0.1,0.1))

         //设置动画效果,动画时间长度 1 秒。
         UIView.animateWithDuration(, delay:0.01,
             options:UIViewAnimationOptions.TransitionNone, animations:
             {
                 ()-> Void in
                 tile.layer.setAffineTransform(CGAffineTransformMakeScale(,))
             },
             completion:{
                 (finished:Bool) -> Void in
                 UIView.animateWithDuration(0.08, animations:{
                     ()-> Void in
                     tile.layer.setAffineTransform(CGAffineTransformIdentity)
                 })
         })
     }
 }
 

(6)样例3:方块从不透明到透明的效果

 
 func playAnimation()
 {
     for tile in backgrounds{
         tile.alpha = ;

         //设置动画效果,动画时间长度 1 秒。
         UIView.animateWithDuration(, delay:0.01,
             options:UIViewAnimationOptions.CurveEaseInOut, animations:
             {
                 ()-> Void in
             },
             completion:{
                 (finished:Bool) -> Void in
                 UIView.animateWithDuration(, animations:{
                     ()-> Void in
                     tile.alpha =
                 })
         })
     }
 }
 

二,使用beginAnimations和commitAnimations方法来实现动画

  • beginAnimations:此方法开始一个动画块,调用commitAnimations结束一个动画块,并且动画块是允许嵌套的。
  • commitAnimations:此方法用于结束一个动画块,动画是在一个独立的线程中运行的,动画在生效时,所有应用程序不会中断。

在beginAnimations和commitAnimations中间的代码中,我们可以设置各种动画的属性。比如持续时间,使用哪种预置的动画效果等。

(1)淡入,淡出,移动,改变大小动画

 
 //淡出动画
 UIView.beginAnimations(nil, context: nil)
 UIView.setAnimationDuration(2.0)
 imageView.alpha = 0.0
 UIView.commitAnimations()

 //淡入动画
 UIView.beginAnimations(nil, context: nil)
 UIView.setAnimationDuration(2.0)
 imageView.alpha = 1.0
 UIView.commitAnimations()

 //移动动画
 UIView.beginAnimations(nil, context: nil)
 UIView.setAnimationDuration(2.0)
 imageView.center = CGPointMake(, )
 UIView.setAnimationCurve(UIViewAnimationCurve.EaseOut) //设置动画相对速度
 UIView.commitAnimations()

 //大小调整动画
 UIView.beginAnimations(nil, context: nil)
 UIView.setAnimationDuration(2.0)
 imageView.frame = CGRectMake(,,,)
 UIView.commitAnimations()

(2)两个视图切换的过渡动画 
  UIViewAnimationTransition定义了5种过渡动画类型:

  • None:无过渡动画效果
  • FlipFromLeft:从左侧向右侧翻转
  • FlipFromRight:从右侧向左侧翻转
  • CurlUp:向上卷数翻页
  • CurlDown:向下翻页
 
 var redView:UIView = UIView(frame: CGRectMake(,,,))
 redView.backgroundColor = UIColor.redColor()
 self.view.insertSubview(redView, atIndex: )

 var blueView:UIView = UIView(frame: CGRectMake(,,,))
 blueView.backgroundColor = UIColor.blueColor()
 self.view.insertSubview(blueView, atIndex: )

 UIView.beginAnimations(nil, context: nil)
 UIView.setAnimationDuration(4.0)
 UIView.setAnimationTransition(UIViewAnimationTransition.CurlUp, forView: self.view, cache: true)
 self.view.exchangeSubviewAtIndex(, withSubviewAtIndex: )
 UIView.commitAnimations()
(3)页面或元件翻转效果

 
 //将整个主视图面板实现一个翻转效果
 UIView.beginAnimations("animation", context: nil)
 UIView.setAnimationDuration()
 UIView.setAnimationCurve(UIViewAnimationCurve.EaseInOut)
 UIView.setAnimationTransition(UIViewAnimationTransition.FlipFromLeft, forView: self.view, cache: false)
 UIView.commitAnimations()

本文转自:http://www.hangge.com

iOS开发——动画篇Swift篇&动画效果的实现的更多相关文章

  1. iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

    swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引 ...

  2. iOS开发——新特性Swift篇&Swift 2.0 异常处理

    Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...

  3. iOS开发——图形编程Swift篇&CAShapeLayer实现圆形图片加载动画

    CAShapeLayer实现圆形图片加载动画 几个星期之前,Michael Villar在Motion试验中创建一个非常有趣的加载动画. 下面的GIF图片展示这个加载动画,它将一个圆形进度指示器和圆形 ...

  4. iOS开发——网络编程Swift篇&Alamofire详解

    Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...

  5. ios开发——实用技术总结Swift篇&swift常用开发技术总结

    swift常用开发技术总结 懒加载:属性,数组(字典),控件... 数组(懒加载): lazy var shops:Array<Dictionary<String, String>& ...

  6. iOS开发——网络编程Swift篇&(八)SwiftyJSON详解

    SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...

  7. iOS开发零基础--Swift篇 元组

    元组的介绍 元组是Swift中特有的,OC中并没有相关类型 它是什么呢? 它是一种数据结构,在数学中应用广泛 类似于数组或者字典 可以用于定义一组数据 组成元组类型的数据可以称为“元素” 元组的定义 ...

  8. iOS开发零基础--Swift篇 循环

    循环的介绍 在开发中经常会需要循环 常见的循环有:for/while/do while. 这里我们只介绍for/while,因为for/while最常见 for循环的写法 最常规写法 // 传统写法 ...

  9. iOS开发零基础--Swift篇:逻辑分支

    一. 分支的介绍 分支即if/switch/三目运算符等判断语句 通过分支语句可以控制程序的执行流程 二. if分支语句 和OC中if语句有一定的区别 判断句可以不加() 在Swift的判断句中必须有 ...

  10. iOS开发零基础--Swift篇:Swift中数据类型

    Swift类型的介绍 Swift中的数据类型也有:整型/浮点型/对象类型/结构体类型等等 先了解整型和浮点型 整型 有符号 Int8 : 有符号8位整型 Int16 : 有符号16位整型 Int32 ...

随机推荐

  1. POJ 2549 Sumsets

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10593   Accepted: 2890 Descript ...

  2. hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛

    感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...

  3. MultiSet

    Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口.Guava中定义的新集合有: Multi ...

  4. 数组乘积--满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出

    数组乘积(15分) 输入:一个长度为n的整数数组input 输出:一个长度为n的整数数组result,满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出). ...

  5. Delphi 712操作word

    //导出Wordprocedure TFrm_Computing.ExportWord;var wordApp, WordDoc, WrdSelection, wrdtable, wrdtable1, ...

  6. lightoj 1021 (数位DP)

    题意:给你一个b进制的数,再给你一个十进制数k,你可以重新排列b进制数的每一位得到其他b进制数,问你这些数中有多少可以整除k? 思路:数位dp. #include <cstdio> #in ...

  7. 关于c3p0配置详细说明

    <!-- c3p0连接池配置 --> <property name="driverClass" value="${c3p0.driverClass}&q ...

  8. 在windows7下配置PHP访问ICE中间件(ICE3.5.1+PHP5.4+Apache2.2 for vc9)

    按照ICE的官方文档(http://doc.zeroc.com/display/Ice/Using+the+Windows+Binary+Distribution#UsingtheWindowsBin ...

  9. JQuery好用的日期选择控件 DatePicker

    近期发现一个很好的基于JQ的前端UI日期选择控件Jquery.DatePicker.js 下载地址:jquery.DatePIcker.js 演示地址:DatePicker - 基于jQuery 1. ...

  10. [Java基础]Java通配符

    转自:http://peiquan.blog.51cto.com/7518552/1303768 本以为这会是一篇比较基础的博客,可一旦深究的时候,才发现很多有意思的东西,也发现了很多令人迷惑的地方. ...