核心動(dòng)畫(huà) coreAnimation
核心動(dòng)畫(huà) coreAnimation 框架是基于OpenGL 與 CoreGraphics 圖片處理框架的一個(gè)跨平臺(tái)的動(dòng)畫(huà) 框架
在CoreAnimation中大部分的動(dòng)畫(huà)都是通過(guò)Layer層來(lái)實(shí)現(xiàn)的,通過(guò)CALayer,我們可以組織復(fù)雜的層級(jí)結(jié)構(gòu)奖唯。
在核心動(dòng)畫(huà)中撤嫩,大多數(shù)的動(dòng)畫(huà)效果是添加在圖層屬性的變化上晨继,例如请毛,改變圖層的位置,大小恨搓,顏色部逮,元半徑
layer層 并不決定試圖的展現(xiàn)娜汁,它只是儲(chǔ)存了試圖的集合屬性的狀態(tài)
let moveAnimation = CABasicAnimation(keyPath: "position.y")
// 這個(gè)動(dòng)畫(huà)的時(shí)長(zhǎng)
moveAnimation.duration = 0.8
// 動(dòng)畫(huà)的起始位置和終點(diǎn)位置
moveAnimation.fromValue = center.y
moveAnimation.toValue = center.x - 30
// 一個(gè)時(shí)間函數(shù) 表示怎樣的運(yùn)行方式
moveAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
// 重復(fù)次數(shù)
moveAnimation.repeatCount = 2
// 重復(fù)的時(shí)長(zhǎng)
moveAnimation.repeatDuration = 2
// 是否在動(dòng)畫(huà)結(jié)束后移除
moveAnimation.isRemovedOnCompletion = false
moveAnimation.fillMode = kCAFillModeForwards
// 添加這個(gè)動(dòng)畫(huà) 后面可以拿到這個(gè)動(dòng)畫(huà)標(biāo)識(shí)
// 第二個(gè)參數(shù) 是后面可以根據(jù)這個(gè)動(dòng)畫(huà)標(biāo)識(shí)拿到這個(gè)動(dòng)畫(huà)
self.layer.add(moveAnimation, forKey: "moveAnimation")
動(dòng)畫(huà)的過(guò)程說(shuō)明
- 伴隨著動(dòng)畫(huà)進(jìn)行,在動(dòng)畫(huà)時(shí)間內(nèi)兄朋,keyPath 相應(yīng)的屬性值fromValue 漸漸的變成toValue
- keyPath 內(nèi)容是calayer 的可動(dòng)畫(huà)animation屬性
3.如果fillMode=kCAFillModeForwards同時(shí)removedOnComletion=NO掐禁,那么在動(dòng)畫(huà)執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫(huà)執(zhí)行后的狀態(tài)颅和。但在實(shí)質(zhì)上傅事,圖層的屬性值還是動(dòng)畫(huà)執(zhí)行前的初始值,并沒(méi)有真正被改變
現(xiàn)在來(lái)說(shuō)CAAnimations 中代理方法< CAAnimationDelegate >
-animationDidStart:
開(kāi)始時(shí)調(diào)用
-animationDidStop:finish
結(jié)束時(shí)調(diào)用
在addAnimation:forKey:
方法中峡扩,也可以給這個(gè)動(dòng)畫(huà)設(shè)置一個(gè)鍵蹭越,可以在其他地方取出來(lái),進(jìn)行一些操作教届,比如刪除般又,也充分體現(xiàn)了kvc的靈活性
CAKeyFrameAnimation-關(guān)鍵幀動(dòng)畫(huà)
關(guān)鍵幀動(dòng)畫(huà) 也是CAPropertyAnimation的子類
如果是簡(jiǎn)單的動(dòng)畫(huà) CABasicAnimation就能滿足,關(guān)鍵幀動(dòng)畫(huà)彌補(bǔ)了基本動(dòng)畫(huà)只能傳入對(duì)應(yīng)值的不足巍佑,關(guān)鍵幀動(dòng)畫(huà)支持傳入一套數(shù)值或者路徑來(lái)完成動(dòng)畫(huà)
與CABasicAnimation的區(qū)別
CABasicAnimation只能從一個(gè)值變成兩外一個(gè)數(shù)值
CAKeyFrameAnimation: 會(huì)使用NSArray保存這些數(shù)值
var bezierPath = UIBezierPath(arcCenter: CGPoint(x:100, y:100), radius: 50, startAngle: 0, endAngle: 0, clockwise: true)
let animation = CAKeyframeAnimation(keyPath: "transform.rotation")
// 上文提到的 幀動(dòng)畫(huà)數(shù)組 在約定的時(shí)間內(nèi) 完成這些動(dòng)畫(huà)
let arr = [M_PI_4, -M_PI_4,M_PI_4]
animation.values = arr
animation.rotationMode = kCAAnimationRotateAuto // 方向
animation.duration = 3; // 動(dòng)畫(huà)時(shí)長(zhǎng)
animation.keyTimes = [0.2,0.8,1]
animation.path = bezierPath.cgPath
animation.repeatCount = 2 // 重復(fù)次數(shù)
self.layer.add(animation, forKey: nil)
value: 動(dòng)畫(huà)對(duì)象會(huì)在指定事件內(nèi),一次顯示values數(shù)組中的每一個(gè)關(guān)鍵幀
path:可以設(shè)置一個(gè)CGPathRef,CGMutablePathRef,讓圖層按照路徑軌跡移動(dòng)寄悯。path只對(duì)calayer和anchorPoint和position作用萤衰,如果設(shè)置了path 那么value將被忽略
keyTime: 對(duì)應(yīng)的關(guān)鍵幀指定對(duì)應(yīng)的時(shí)間點(diǎn),如果沒(méi)有設(shè)置keyTimes 各個(gè)關(guān)鍵幀時(shí)間是平分的
CAAnimationGroup-動(dòng)畫(huà)組
動(dòng)畫(huà)組猜旬,是caanimation的子類脆栋,可以保存一組動(dòng)畫(huà)對(duì)象,將CAAnimationGroup對(duì)象加入層后洒擦,組中雖有動(dòng)畫(huà)對(duì)象可以同時(shí)并發(fā)運(yùn)行
轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
// 轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
let caTransition = CATransition()
caTransition.duration = 0.2
caTransition.delegate = self
caTransition.timingFunction = CAMediaTimingFunction(name: "easeInEaseOut")
caTransition.type = kCATransitionReveal // 動(dòng)畫(huà)風(fēng)格
caTransition.subtype = kCATransitionFromLeft // 動(dòng)畫(huà)方向
type: 動(dòng)畫(huà)過(guò)渡類型
subType: 動(dòng)畫(huà)過(guò)渡方向
CALyer
UIView和CALayer的關(guān)系 - 平行關(guān)系
每個(gè)UIView都有一個(gè)CALayer實(shí)例的圖層屬性椿争。
視圖的職責(zé)就是創(chuàng)建并管理這個(gè)圖層。
UIView和CALyer有著平行的層級(jí)關(guān)系熟嫩,職責(zé)分離秦踪。
UIView的高級(jí)API可以實(shí)現(xiàn)一些簡(jiǎn)單的動(dòng)畫(huà)效果,但更多的細(xì)節(jié)和底層還需要通過(guò)CALayer直接處理CAAnimation來(lái)處理。
UIView能實(shí)現(xiàn)但CALayer不能實(shí)現(xiàn)
1.處理觸摸事件
UIView沒(méi)有暴露出來(lái)的CALayer的功能
1.陰影椅邓、圓角柠逞、帶顏色的邊框
2.3D變換
3.非矩形范圍
4.透明覆蓋
5.多級(jí)非線性動(dòng)畫(huà)