Swift說話完成地圖坐標彈跳動畫。本站提示廣大學習愛好者:(Swift說話完成地圖坐標彈跳動畫)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift說話完成地圖坐標彈跳動畫正文
上面運用Swift說話做地圖坐標完成彈簧跳動的後果,詳細完成辦法以下所示:
iOS動畫年夜概分這幾種:
CoreAnimation動畫(基本)UIView動畫(animateWithDuration開首的函數,帶彈簧殊效)UIDynamic動畫(有物理引擎)
前次寫彈跳動畫,因為剛開端學,就用了最基本的CA動畫,然則由於本身不會寫KeyFrame,所以還援用了一個開源庫來完成下墜的彈跳後果,如許雖然是完成了需求,然則一點都不優雅——從iOS7開端,有了2、3兩種動畫,就不再須要用老的CA動畫去一點一點拔了。做這個動畫的准確姿態,應當是上面如許~
我們的需求依然是這個彈跳的marker:
此次我用了2、3兩種方法完成,後果以下:
1、UIView動畫
之前應用CABasicAnimation完成,不只代碼多,還要用CATransaction掌握回來的一趟callback。其實直接用iOS7的UIView動畫就弄定了:
UIView.animateWithDuration(0.2, animations: { self.marker.layer.position.y -= 30 }, completion: {(finished) in UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 5.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {//彈性參數的調教,可以拜見本文的“參考”部門 self.marker.layer.position.y += 30 }, completion: nil)})
在上升進程中,直接在0.2s的時光中,向上挪動30px;向下進程中,為了表現彈跳的後果,應用了Spring系列參數,做了一下調劑以後,感到後果照樣挺成心思的。然則純真應用這個有一個缺陷:我們要的是相似於重力下墜,而非像一根彈簧一樣彈到誰人地位。留意那跟藍色的比擬線,我們完成的是右邊的後果,在動畫進程中,它會跨越那根藍色線條,所以實際上是不相符需求的。
2、UIDynamic動畫
UIDynamic動畫是有物理引擎的動畫,我們只須要設定這個“物體”的物理特征,iOS就會主動幫我們停止物理世界的動畫運算。起首我們創立它的物理特征:
var animator : UIDynamicAnimator?override func viewDidLoad() { super.viewDidLoad() animator = UIDynamicAnimator(referenceView: view)} override func viewDidAppear(animated: Bool) { let gravity = UIGravityBehavior(items: [marker2])//重力 let elastic = UIDynamicItemBehavior(items: [marker2])//彈性 elastic.elasticity = 0.6 let collision = UICollisionBehavior(items: [marker2])//邊沿 let endY = marker2.frame.origin.y + marker2.frame.height// 記載marker2的底部坐標 collision.addBoundaryWithIdentifier("floor", fromPoint: CGPoint(x: 0, y: endY), toPoint: CGPoint(x: UIScreen.mainScreen().bounds.width, y: endY))//在marker2的底部畫一條線,從屏幕右邊到屏幕左邊 animator!.addBehavior(collision) animator!.addBehavior(gravity) animator!.addBehavior(elastic)}
起首我們創立一個animator,然後創立關於marker2的重力、彈性、邊沿三個屬性,附加在animator上。因而這個marker2便有了物理特征。然後我們和之前一樣把它舉高:
UIView.animateWithDuration(0.2, animations: { self.marker2.layer.position.y -= 30 }, completion: {(finished : Bool) in self.animator!.updateItemUsingCurrentState(self.marker2)//假如不update,則animator不曉得它的地位被挪動過了})
在動畫完成後,讓animator從新對它停止運動,就到達了文章開端的gif圖中,第二個marker的彈跳後果。
文章到此為止,願望對年夜家有所贊助,感謝。