IOS動(dòng)畫技術(shù)詳解

視圖動(dòng)畫

UIView動(dòng)畫塊

ios4.0之后在UIView類中提供以下幾個(gè)處理動(dòng)畫的方法倍啥。

+animateWithDuration:animations
+animateWithDuration:animations:completion
+animateWithDuration:delay:options:animations:completion

其中animateWithDuration后面的參數(shù)是動(dòng)畫的持續(xù)時(shí)間。而animations后面是一個(gè)block代碼塊,具體的動(dòng)畫內(nèi)容就寫在這個(gè)代碼塊里面澎埠。delay是動(dòng)畫延遲多少時(shí)間后執(zhí)行虽缕,如果設(shè)置為0就表示馬上執(zhí)行。好啦蒲稳,接下來我們來看一個(gè)例子吧氮趋。動(dòng)畫效果如下:


import UIKit

class AnimationBlokViewController: UIViewController {
    @IBOutlet weak var ball: UIImageView!//關(guān)聯(lián)UIImageView為圖片設(shè)置動(dòng)畫
    var flag = 1
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
//為button設(shè)置一個(gè)點(diǎn)擊事件,點(diǎn)擊后執(zhí)行動(dòng)畫
    @IBAction func click(sender: AnyObject) {
        UIView.animateWithDuration(1.5) {
            var frame = self.ball.frame
            frame.origin.y += CGFloat(100 * self.flag)
            self.flag *= -1 
            self.ball.frame = frame
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
過渡動(dòng)畫

ios4.o之后在UIView中增加了兩個(gè)過度動(dòng)畫的方法
+transitionWithView:duration:options:animations:completion:制定的容器內(nèi)創(chuàng)建過渡動(dòng)畫。
+transitionFromView:toView:duration:options:completion:指定的兩個(gè)視圖之間創(chuàng)建過渡動(dòng)畫江耀。
接下來讓我們看看一個(gè)例子吧剩胁。在視圖中創(chuàng)建4個(gè)button分別關(guān)聯(lián)下面四個(gè)方法。點(diǎn)擊就執(zhí)行對(duì)應(yīng)的過渡動(dòng)畫决记。值得注意的是其中options參數(shù)含有多個(gè)值時(shí)在oc中是按位或符號(hào)|將多個(gè)參數(shù)連接起來摧冀,而在swift中會(huì)報(bào)錯(cuò),在swift中我們使用傳遞數(shù)組的形式[]傳遞多個(gè)參數(shù)系宫。
相關(guān)的options參數(shù)有:
1.TransitionFlipLeft:從左往右翻轉(zhuǎn)
2.TransitionFlipRight:從右往左翻轉(zhuǎn)
3.TransitionCurlUp:向上翻頁(yè)
4.TransitionCurlDown:向下翻頁(yè)
5.TransitionCrossDissolve:交叉溶解效果
6.TransitionFlipFromTop:從上往下翻轉(zhuǎn)
7.TransitionFlipFromBottom:從下往上翻轉(zhuǎn)
8.CurveEaseInOut:緩入緩出索昂,開始和結(jié)束時(shí)減速
9.CurveEaseIn:緩入,開始時(shí)減速
10.CurveEaseOut:緩出扩借,結(jié)束時(shí)減速
11.CurveEaseLinear:線性椒惨,勻速運(yùn)動(dòng)
其中前七個(gè)或者后四個(gè)不能同時(shí)有兩個(gè)或者以上在一個(gè)數(shù)組中使用否則會(huì)沖突。
動(dòng)畫效果如下:


import UIKit

class TrasitionViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
//從左往右翻轉(zhuǎn)
    @IBAction func FlipFromLeft(sender: AnyObject) {
        UIView.transitionWithView(self.view, duration: 3.0, options:[UIViewAnimationOptions.CurveEaseOut,UIViewAnimationOptions.TransitionFlipFromLeft], animations: {
            print("動(dòng)畫開始")
            }) { (finished) in
                print("動(dòng)畫完成")
        }
    }

//從右往左翻轉(zhuǎn)
    @IBAction func FlipFromRight(sender: AnyObject) {
        UIView.transitionWithView(self.view, duration: 3.0, options: [UIViewAnimationOptions.CurveEaseOut,UIViewAnimationOptions.TransitionFlipFromRight], animations: {
            print("動(dòng)畫開始")
        }) { (finished) in
            print("動(dòng)畫完成")
        }
    }
    
//向上翻頁(yè)
    @IBAction func CurlUP(sender: AnyObject) {
        UIView.transitionWithView(self.view, duration: 3.0, options: [UIViewAnimationOptions.CurveEaseOut,UIViewAnimationOptions.TransitionCurlUp], animations: {
            print("動(dòng)畫開始")
        }) { (finished) in
            print("動(dòng)畫完成")
        }
    }
    
//向下翻頁(yè)
    @IBAction func CurlDown(sender: AnyObject) {
        UIView.transitionWithView(self.view, duration: 3.0, options: [UIViewAnimationOptions.CurveEaseOut,UIViewAnimationOptions.TransitionCurlDown], animations: {
            print("動(dòng)畫開始")
        }) { (finished) in
            print("動(dòng)畫完成")
        }
    }
}```
####自定義過渡動(dòng)畫
視圖之間過渡潮罪,跳轉(zhuǎn)有兩種情況康谆,一種是樹形結(jié)構(gòu)導(dǎo)航,而另一種是模態(tài)視圖導(dǎo)航嫉到。樹形結(jié)構(gòu)導(dǎo)航是通過UINavigationController控制視圖的堆棧實(shí)現(xiàn)視圖的過渡沃暗,模態(tài)導(dǎo)航是通過UIViewController控制視圖實(shí)現(xiàn)的。針對(duì)這兩種跳轉(zhuǎn)何恶,我們的自定義過渡動(dòng)畫也分為這兩種孽锥。
在ios自定義過渡動(dòng)畫類需要實(shí)現(xiàn)UIViewControllerAnimateTransitiong協(xié)議的方法。其中有兩個(gè)重要的方法。
1.-animateTransition:執(zhí)行自定義的動(dòng)畫惜辑。
2.-transitionDuration:設(shè)置動(dòng)畫執(zhí)行的時(shí)間唬涧。
接下來我們還是用實(shí)例說話:將模態(tài)導(dǎo)航和樹形結(jié)構(gòu)導(dǎo)航用法一起演示一遍:
![](http://chuantu.biz/t5/33/1473579787x1987391531.gif)

import UIKit

class SlideTransitionAnimator: NSObject,UIViewControllerAnimatedTransitioning {

func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
    return 1.5
}

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
    let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
    let transformedStartFrame = toVC!.view.frame
    
    let origin = transformedStartFrame.origin
    let width = transformedStartFrame.width
    let height = transformedStartFrame.height
    let transformedEndframe = CGRectMake((origin.x)-width, origin.y,width, height)
    transitionContext.containerView()?.addSubview((fromVC?.view)!)
    transitionContext.containerView()?.addSubview((toVC?.view)!)
    
    UIView.animateWithDuration(3, animations: {
        toVC?.view.frame = transformedEndframe
        toVC?.view.alpha = 0.5
        }) { (finished) in
            toVC?.view.frame = transformedEndframe
            toVC?.view.alpha = 1.0
            transitionContext.completeTransition(true)
    }
}

}

import UIKit

class CustomViewController: UIViewController ,UINavigationControllerDelegate,UIViewControllerTransitioningDelegate{

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.delegate = self
    self.transitioningDelegate = self
}

@IBAction func treeClick(sender: AnyObject) {
    let VC = UIGravityViewController()
    self.navigationController?.showViewController(VC, sender: nil)
}

@IBAction func presentClick(sender: AnyObject) {
    let VC = UIGravityViewController()
    self .presentViewController(VC, animated: true) { 
        print("過渡完成")
    }
    
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   
        let destionViewController = segue.destinationViewController as UIViewController
        destionViewController.transitioningDelegate = self
}

func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    let animator = SlideTransitionAnimator()
    return animator
}

func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    let animator = SlideTransitionAnimator()
    return animator
}

 func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    let animator = SlideTransitionAnimator()
    return animator
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

####UIKit力學(xué)
UIKit力學(xué)是IOS7推出的技術(shù),作用是使視圖對(duì)象具有真實(shí)的物理運(yùn)動(dòng)效果盛撑。
其中包括的力學(xué)效果有:
#####1.重力行為(UIGravityBehavior)
重力行為能夠模擬視圖對(duì)象受重力影響而掉落的效果碎节。效果圖如下:

![gravity.gif](http://upload-images.jianshu.io/upload_images/1746439-3c60e669c4bd15fa.gif?imageMogr2/auto-orient/strip)

import UIKit

class UIGravityViewController: UIViewController {
@IBOutlet weak var ballImageView: UIImageView!
var animator : UIDynamicAnimator!
var gravity : UIGravityBehavior!

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "重力行為"
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.animator = UIDynamicAnimator(referenceView: self.view)
    //實(shí)例重力行為
    self.gravity = UIGravityBehavior(items: [self.ballImageView])
    //設(shè)置重力的方向
    let gravityDirection : CGVector = CGVectorMake(0.0, 0.1)
    self.gravity.gravityDirection = gravityDirection
    self.animator.addBehavior(self.gravity) 
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}```

2.碰撞行為(UICollisionBehavior)

如同物理世界一樣物體碰撞會(huì)反彈效果。效果圖如下:

collision.gif
import UIKit

class UICollisonViewController: UIViewController {
    @IBOutlet weak var ballImageView: UIImageView!
    
    var collision : UICollisionBehavior!
    var animator : UIDynamicAnimator!
    var gravity : UIGravityBehavior!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "碰撞行為"
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        self.animator = UIDynamicAnimator(referenceView: self.view)
        //重力行為
        self.gravity = UIGravityBehavior(items: [self.ballImageView])
        let gravityDirection : CGVector = CGVectorMake(0.0, 0.1)
        self.gravity.gravityDirection = gravityDirection
        self.animator.addBehavior(self.gravity)
        //碰撞行為
        self.collision = UICollisionBehavior(items: [self.ballImageView])
        self.collision.translatesReferenceBoundsIntoBoundary = true
        self.animator.addBehavior(self.collision)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}```
#####3.吸附行為(UIAttachmentBehavior)
吸附行為可以實(shí)現(xiàn)兩個(gè)物體彼此牽制抵卫,就好像用一根棍子將兩個(gè)物體連接在一起狮荔。效果圖如下:

![attachment.gif](http://upload-images.jianshu.io/upload_images/1746439-6d3bd327c889af58.gif?imageMogr2/auto-orient/strip)

import UIKit

class UIAttachmentViewController: UIViewController,UICollisionBehaviorDelegate {

@IBOutlet weak var attachmentPoint: UIImageView!
@IBOutlet weak var box: UIImageView!
@IBOutlet weak var barrier: UIImageView!
var collision : UICollisionBehavior!
var animator : UIDynamicAnimator!
var gravity : UIGravityBehavior!
var attach : UIAttachmentBehavior!

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "吸附行為"
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.animator = UIDynamicAnimator(referenceView: self.view)
    //重力行為
    self.gravity = UIGravityBehavior(items: [self.box])
    self.animator.addBehavior(self.gravity)
    //碰撞行為
    self.collision = UICollisionBehavior(items: [self.box])
    let width = self.barrier.frame.size.width
    let origin = self.barrier.frame.origin
    self.collision.addBoundaryWithIdentifier("barrier", fromPoint: origin, toPoint: CGPointMake(origin.x+width, origin.y))
    self.collision.translatesReferenceBoundsIntoBoundary = true
    self.collision.collisionDelegate = self
    self.animator.addBehavior(self.collision)
    let itemBehaviour = UIDynamicItemBehavior(items: [self.box])
    itemBehaviour.elasticity = 0.5
    self.animator.addBehavior(itemBehaviour)
}
//碰撞行為協(xié)議
internal func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, atPoint p: CGPoint){
    //吸附行為
    self.attach = UIAttachmentBehavior(item: self.attachmentPoint, attachedToItem: self.box)
    self.animator.addBehavior(self.attach)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}```

4.推行為(UIPushBehavior)

推行為可以使視圖對(duì)象朝某個(gè)方向運(yùn)動(dòng),這個(gè)推力有瞬間(UIPushBehaviorModeInstantaneous)(UIPushBehaviorModeContinuous)兩種介粘。效果圖如下:

push.gif
import UIKit

class UIPushViewController: UIViewController,UICollisionBehaviorDelegate {

    @IBOutlet weak var barrier: UIImageView!
    @IBOutlet weak var box: UIImageView!
    @IBOutlet weak var attachmentPoint: UIImageView!
    var firstConcact = false
    
    var collision : UICollisionBehavior!
    var animator : UIDynamicAnimator!
    var gravity : UIGravityBehavior!
    var attach : UIAttachmentBehavior!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "推行為"
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        self.animator = UIDynamicAnimator(referenceView: self.view)
        self.gravity = UIGravityBehavior(items: [self.box])
        self.animator.addBehavior(self.gravity)
        
        self.collision = UICollisionBehavior(items: [self.box])
        let width = self.barrier.frame.size.width
        let origin = self.barrier.frame.origin
        self.collision.addBoundaryWithIdentifier("barrier", fromPoint: origin, toPoint: CGPointMake(origin.x+width, origin.y))
        self.collision.translatesReferenceBoundsIntoBoundary = true
        self.collision.collisionDelegate = self
        self.animator.addBehavior(self.collision)
        let itemBehaviour = UIDynamicItemBehavior(items: [self.box])
        itemBehaviour.elasticity = 0.5
        self.animator.addBehavior(itemBehaviour)
    }
    
    internal func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, atPoint p: CGPoint){
        if !self.firstConcact {
        self.firstConcact = true
        
        self.attach = UIAttachmentBehavior(item: self.attachmentPoint, attachedToItem: self.box)
        self.animator.addBehavior(self.attach)
        //設(shè)置推行為
        let push = UIPushBehavior(items: [self.box],mode: UIPushBehaviorMode.Instantaneous)
        //設(shè)置推行為的方向和力度
        push.setAngle(CGFloat(-M_PI/4.0), magnitude: 5.0)
        self.animator.addBehavior(push)
        
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}```
#####5.甩行為(UISnapBehavior)
能夠使物體朝某個(gè)方向甩出轴合,并有瞬間加速度,由慢及快碗短,再由快及慢,最后停止在目標(biāo)點(diǎn)题涨。效果圖如下:

![snap.gif](http://upload-images.jianshu.io/upload_images/1746439-741dc692417379f9.gif?imageMogr2/auto-orient/strip)

import UIKit

class UISnapViewController: UIViewController {
var animator : UIDynamicAnimator!
var snap : UISnapBehavior!

@IBOutlet weak var box: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    box.userInteractionEnabled = true;
    box.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(UISnapViewController.snapClick(_:))))
      self.title = "甩行為"
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.animator = UIDynamicAnimator(referenceView: self.view)
   
}

func snapClick(sender: AnyObject) {
print("甩")
let gesture = sender as! UITapGestureRecognizer
let point = gesture.locationInView(self.view)
if self.snap != nil {
self.animator.removeBehavior(self.snap)
}
self.snap = UISnapBehavior(item: self.box, snapToPoint: point)
self.animator.addBehavior(self.snap)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}```

6.行為限制(DynamicItemBehavior)

行為限制于上面五個(gè)行為不同偎谁,它是用來設(shè)置力學(xué)行為參數(shù)的。參數(shù)如下:
(1)density:密度纲堵,如果一個(gè)100x100點(diǎn)的物體密度是1.0作用力是1.0那么它的加速度是100點(diǎn)/s^2
(2)elasity:彈性系數(shù)巡雨,取值范圍0.0-1.0。其中0.0代表沒有反彈席函,1.0代表完全彈性碰撞铐望。
(3)friction:摩擦系數(shù),0.0表示沒有摩擦力茂附,1.0表示摩擦力很強(qiáng)正蛙。還可以設(shè)置超過1.0的跟大的摩擦力。
(4)resistance:阻力营曼,0.0表示沒有阻力乒验,CGFLOAT_MAX表示最大阻力。
(5)allowsRotation:是否允許旋轉(zhuǎn)蒂阱。
(6)angularResistance:角阻力锻全,物體旋轉(zhuǎn)是旋轉(zhuǎn)方向的阻力。
我們來看看DynamicItemBehavior具體怎么使用吧:

 let itemBehaviour = UIDynamicItemBehavior(items:[self.view])
        itemBehaviour.elasticity = 0.5
        itemBehaviour.allowsRotation = true
        itemBehaviour.friction = 0.0
        itemBehaviour.resistance = 0.0
        self.animator.addBehavior(itemBehaviour)

Core Animation框架

(1)隱式動(dòng)畫是一種最簡(jiǎn)單動(dòng)畫录煤,不用設(shè)置定時(shí)器鳄厌,不用考慮線程或者重畫,它的很多屬性都是默認(rèn)的妈踊。
(2)顯式動(dòng)畫是一種使用CABasicAnimation創(chuàng)建的動(dòng)畫通過CABasicAnimation了嚎,可以更明確的定義屬性如何改變動(dòng)畫。
動(dòng)畫效果如下:


隱式動(dòng)畫
import UIKit

class ExplicitViewController: UIViewController {
    @IBOutlet weak var plane: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.plane.layer.opacity = 0.25
    }

    //不透明度從0.25-1.0
    @IBAction func implicitClick(sender: AnyObject) {
        let moveTransform = CGAffineTransformMakeTranslation(180, 200)
        self.plane.layer.setAffineTransform(moveTransform)
        self.plane.layer.opacity = 1;
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}```
#####顯式動(dòng)畫

import UIKit

class ExplicitViewController: UIViewController {
@IBOutlet weak var plane: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    self.plane.layer.opacity = 0.25
}

@IBAction func explicitClick(sender: AnyObject) {
let opAnim = CABasicAnimation(keyPath: "opacity")
//定義動(dòng)畫時(shí)間
opAnim.duration = 3.0
//將透明的從0.25-1.0
opAnim.fromValue = 0.25
opAnim.toValue = 1.0
//指定累計(jì)上次值
opAnim.cumulative = true
//動(dòng)畫重復(fù)2次
opAnim.repeatCount = 2
//保持動(dòng)畫結(jié)束值
opAnim.fillMode = kCAFillModeForwards
//動(dòng)畫結(jié)束時(shí)不停止
opAnim.removedOnCompletion = false
self.plane.layer.addAnimation(opAnim, forKey: "animateOpacity")

    let moveTransform = CGAffineTransformMakeTranslation(180, 200)
    let moveAnim = CABasicAnimation(keyPath: "transform")
    moveAnim.duration = 6.0
    moveAnim.toValue = NSValue(CATransform3D: CATransform3DMakeAffineTransform(moveTransform))
    moveAnim.fillMode = kCAFillModeForwards
    moveAnim.removedOnCompletion = false
    self.plane.layer.addAnimation(moveAnim, forKey: "animateTransform")
    opAnim.fillMode = kCAFillModeForwards
    opAnim.removedOnCompletion = false
    
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}```

關(guān)鍵幀動(dòng)畫
import UIKit

class ExplicitViewController: UIViewController {
    @IBOutlet weak var plane: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.plane.layer.opacity = 0.25
    }

 @IBAction func keyFrameClick(sender: AnyObject) {
        let opAnim = CAKeyframeAnimation(keyPath: "opacity")
        opAnim.duration = 6.0
        opAnim.values = [0.25,0.75,1.0]
        opAnim.keyTimes = [0.0,0.5,1.0]
        opAnim.fillMode = kCAFillModeForwards
        opAnim.removedOnCompletion = false
        self.plane.layer.addAnimation(opAnim, forKey: "animateOpacity")
        
        let moveTransform = CGAffineTransformMakeTranslation(180, 200)
        let moveAnim = CABasicAnimation(keyPath: "transform")
        moveAnim.duration = 6.0
        moveAnim.toValue = NSValue(CATransform3D: CATransform3DMakeAffineTransform(moveTransform))
        moveAnim.fillMode = kCAFillModeForwards
        moveAnim.removedOnCompletion = false
        self.plane.layer.addAnimation(moveAnim, forKey: "animateTransform")
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}```
#####使用路徑
效果圖如下:

![usePath.gif](http://upload-images.jianshu.io/upload_images/1746439-bdfb4ecc4f660fe4.gif?imageMogr2/auto-orient/strip)

import UIKit

class PathViewController: UIViewController {
@IBOutlet weak var ball: UIImageView!
var flag = 1
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}

@IBAction func click(sender: AnyObject) {
    self.button.alpha = 0.0
    //創(chuàng)建可變路徑
    let startPath = CGPathCreateMutable()
    CGPathMoveToPoint(startPath, nil, 160.0, 100.0)
    CGPathAddLineToPoint(startPath, nil, 100.0, 280.0)
    CGPathAddLineToPoint(startPath, nil, 260.0, 170.0)
     CGPathAddLineToPoint(startPath, nil, 60.0, 170.0)
    CGPathAddLineToPoint(startPath, nil, 220.0, 280.0)
     //封閉子路徑
    CGPathCloseSubpath(startPath)
    
    let animation = CAKeyframeAnimation(keyPath: "position")
    animation.duration = 5.0
     //只有關(guān)鍵幀動(dòng)畫才有setPath方法
    animation.path = startPath
    animation.delegate = self
    self.ball.layer.addAnimation(animation, forKey: "position")

}

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    UIView.animateWithDuration(1.0) {
        self.button.alpha = 1.0
    }
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

所有的代碼實(shí)例我都建在一個(gè)git工程里面响委,https://git.oschina.net/2276282419/Animator需要的朋友可以下載源代碼看看新思。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窖梁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夹囚,更是在濱河造成了極大的恐慌纵刘,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荸哟,死亡現(xiàn)場(chǎng)離奇詭異假哎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鞍历,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門舵抹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劣砍,你說我怎么就攤上這事惧蛹。” “怎么了刑枝?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵香嗓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我装畅,道長(zhǎng)靠娱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任掠兄,我火速辦了婚禮像云,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚂夕。我一直安慰自己迅诬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布婿牍。 她就那樣靜靜地躺著百框,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牍汹。 梳的紋絲不亂的頭發(fā)上铐维,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音慎菲,去河邊找鬼嫁蛇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛露该,可吹牛的內(nèi)容都是我干的睬棚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抑党!你這毒婦竟也來了包警?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤底靠,失蹤者是張志新(化名)和其女友劉穎害晦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑中,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壹瘟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳄逾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稻轨。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雕凹,靈堂內(nèi)的尸體忽然破棺而出殴俱,到底是詐尸還是另有隱情,我是刑警寧澤枚抵,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布粱挡,位于F島的核電站,受9級(jí)特大地震影響俄精,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榕堰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一竖慧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逆屡,春花似錦圾旨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至莺治,卻和暖如春廓鞠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谣旁。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工床佳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榄审。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓砌们,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浪感,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 翻譯自“View Controller Programming Guide for iOS”昔头。 1 彈出視圖控制器...
    lakerszhy閱讀 3,546評(píng)論 2 20
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件影兽、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,120評(píng)論 4 61
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果揭斧,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌赢笨。在這里你可以看...
    每天刷兩次牙閱讀 8,514評(píng)論 6 30
  • This evening, my niece and I went to do some 廣場(chǎng)舞. 廣場(chǎng)舞, or...
    doooodles閱讀 695評(píng)論 0 1
  • “崽啊~歸來吃飯嘞~”未蝌,聽著奶奶一聲聲綿長(zhǎng)的呼喚轮锥,阿強(qiáng)戀戀不舍地一步三回頭從村口回來淑翼,滿臉失望地牽著奶奶的手回家。...
    午橋閱讀 266評(píng)論 0 0