動畫在APP開發過程當中 你們多多少少都會接觸到 並且隨着ios7的扁平化風格啓用以後 愈來愈多的APP開始嘗試加入各類絢麗的動畫交互效果以增長APP的用戶體驗(固然 仍是以國外的APP居多)ios
有過相關開發經驗的同窗確定知道在iOS中 動畫相關的部分都是基於Core Animation 可是今天咱們不討論Core Animation 今天的主角是POP -來自於Facebook的動畫引擎(其實我不喜歡把POP定義爲動畫引擎 我願意稱它爲函數發生器)git
官方地址 https://github.com/facebook/pop
官方介紹(翻譯版)github
POP是一個在iOS與OS X上通用的極具擴展性的動畫引擎 它在基本的靜態動畫的基礎上增長的彈簧動畫與衰減動畫 使之能創造出更真實更具物理性的交互動畫 POP的API能夠快速的與現有的ObjC代碼集成並能夠做用於任意對象的任意屬性
POP是個至關成熟且久經考驗的框架 Facebook出品的使人驚歎的Paper應用中的全部動畫和效果即出自POPspring
安裝方式仍是推薦使用CocoaPod框架
1 |
pod 'pop', '~> 1.0' |
POP的神奇之處在於 它是獨立與Core Animation的存在 因此 忘記Core Animation吧 忘記Layer Tree吧 迎接一個簡單的明天 (LOL 開玩笑的~:) 不少地方仍是會須要Core Animation的 不過說不定哪天蘋果大發善心 將動畫相關的部分向POP借鑑一點也不是不可能的(好比SpriteKit就借鑑了Cocos2D :)ide
POP默認支持三種動畫 但同時也支持自定義動畫函數
這裏咱們只討論前三種(由於自定義動畫我也沒用過 :) 先來看看官方的示例代碼吧動畫
1 |
//Basic animations can be used to interpolate values over a specified time period. To use an ease-in ease-out animation to animate a view's alpha from 0.0 to 1.0 over the default duration: |
POPBasicAnimation使用最普遍 提供固定時間間隔的動畫(如淡入淡出效果)ui
1 |
POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionX]; |
能夠看到 添加一個動畫最少僅需三步
POPBasicAnimation可配置的屬性與默認值爲
1 |
duration:0.4 //動畫間隔 |
POPBasicAnimation提供四種timingfunction(很熟悉 對不對? 就是Core Animation中那些)
其時間函數分別以下
POPSpringAnimation也許是大多數人使用POP的理由 其提供一個相似彈簧通常的動畫效果(使用後 APP立馬就活潑起來了 有木有?!)
1 |
POPSpringAnimation *anSpring = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionX]; |
POPSpringAnimation可配置的屬性與默認值爲
1 |
springBounciness:4.0 //[0-20] 彈力 越大則震動幅度越大 |
注意:POPSpringAnimation是沒有duration字段的 其動畫持續時間由以上幾個參數決定
POPDecayAnimation提供一個過阻尼效果(其實Spring是一種欠阻尼效果) 能夠實現相似UIScrollView的滑動衰減效果(是的 你能夠靠它來本身實現一個UIScrollView)
1 |
POPDecayAnimation *anDecay = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX]; |
注意:這裏對POPDecayAnimation設置toValue是沒有意義的 會被忽略(由於目的狀態是動態計算獲得的)
POPDecayAnimation可配置的屬性與默認值爲
1 |
deceleration:0.998 //衰減係數(越小則衰減得越快) |
注意:POPDecayAnimation也是沒有duration字段的 其動畫持續時間由velocity與deceleration決定
接下來咱們看一下POP默認支持哪些屬性的動畫 打開POPAnimatablePropery.h能夠看到以下定義(這些是到目前爲止 所支持的屬性 隨着版本的更新 還在不斷的新增中 :)
1 |
/** |