UIView的成员的动画;View之间转换的动画;Core Animation:底层的,强大的动画框架;Dynamic Animation:基于物理引擎的动画。
UIView的成员的动画:
一个调用即可,动画在另一个线程执行,这段设置执行过后会立即执行之后的代码:
UIView.animateWithDuration(3.0,//执行时间 delay: 2.0,//等待时间 options: UIViewAnimationOptions.CurveEaseInOut,//动画效果选择 animations: { () -> Void in//设置你的动画 //在执行这句话时这个属性立即变为0,你所看到的动画只是表象 self.imageView.alpha = 0.0 self.imageView.transform.tx = 20.0 //self.imageView.frame.height }, completion: { (Bool) -> Void in//动画执行完后,或被其他动画打断后执行,布尔值会告诉你是否完成这次动画 if Bool { self.imageView.alpha = 1.0 } })
另一种:
UIView.transitionWithView(self.imageView, duration: 2, options: UIViewAnimationOptions.TransitionFlipFromLeft, animations: { () -> Void in self.image = UIImage(named: "1") }, completion: { (Bool) -> Void in })还有一种视图层级的:
UIView.transitionFromView(fromView: UIView, toView: UIView, duration: NSTimeInterval, options: UIViewAnimationOptions, completion: { (Bool) -> Void in //code })
Dynamic Animation
UIGravityBehavior,UIAttachmentBehavior,UICollisionBehavior,UISnapBehavior,UIPushBehavior,UIDynamicItemBehavior。UIDynamicBehavior是他们的父类。它有一个属性叫action,这是一个闭包函数,每个动画在执行时都会调用这个函数,如果一个对象在持续加速,那么就会持续调用这个函数。
以UIGravityBehavior为例,首先初始化一个UIDynamicAnimator和一个Behavior:
let gravity = UIGravityBehavior() //var animator: UIDynamicAnimator = UIDynamicAnimator(referenceView: gameView) //这句话会报错因为现在我们还处在构造这个类的过程中,在构造完成前我们不能访问属性和方法 lazy var animator: UIDynamicAnimator = { return UIDynamicAnimator(referenceView: self.gameView) }()//调用animator时要注意gameView一定已经初始化好了
animator.addBehavior(gravity) <p class="p1"><span class="s1"> gravity</span><span class="s2">.</span><span class="s3">addItem</span><span class="s2">(dropView)</span></p>如果你有很多个Behavior要添加,可以自己建一个UIDynamicBehavior的子类,通过复写初始化函数的方法添加子behavior:
override init() { super.init() addChildBehavior(gravity) addChildBehavior(collider) }这样写一个公共方法就可以完成多个动画的添加:
func addDrop(drop: UIView){ dynamicAnimator?.referenceView?.addSubview(drop) gravity.addItem(drop) collider.addItem(drop) }如果你需要知道动画是否停止,或者是否即将要继续,你需要将自己设为代理并实现相应的方法:
animator.delegate = self