一、pop介紹
POP的開發者是Kimon Tsinteris, Push Pop Press 的聯合創始人,曾經在Apple擔任高級工程師,并參與了 iPhone 和 iPad 上軟件的研發(iPhone的指南針以及地圖)。2011年的時候 Facebook 收購了他的公司,此后他便加入了 Facebook 負責 Facebook iOS 版本的開發。不滿于 Apple 自身動畫框架的單調,Push Pop Press 致力于創造一個逼真的、充滿物理效應的體驗。 POP 就是這個理念下最新一代的成果。POP 使用 Objective-C++ 編寫,Objective-C++ 是對 C++ 的擴展,就像 Objective-C 是 C 的擴展。而至于為什么他們用 Objective-C++ 而不是純粹的 Objective-C,原因是他們更喜歡 Objective-C++ 的語法特性所提供的便利。
二、入門
閱讀代碼最困難的就是第一步,找不到從哪里入手,代碼拷下來后,看代碼的架構圖分為4類,那就先從架構說起吧。
POP 動畫十分流暢,主要依賴于就這個 Engine 中的POPAnimator 里,POP 通過 CADisplayLink 高達 60 FPS 的特性,使自己的動畫達到了游戲級的體驗。CADisplayLink 是類似 NSTimer 的定時器,區別是,NSTimer 用于我們定義任務的執行周期、資料的更新周期,他的執行受到 CPU 的阻塞影響,而CADisplayLink使用場合相對專一,適合做UI的不停重繪,比如自定義動畫引擎或者視頻播放的渲染。通過 CADisplayLink,Apple 允許你將 App 的重繪速度設定到和屏幕刷新頻率一致,由此你可以獲得非常流暢的交互動畫,這項技術的應用在游戲中非常常見,著名的 Cocos-2D 也應用了這個重要的技術。
WebCore里包含了一些從 Apple 的開源的網頁渲染引擎里拿出的源文件,與 Utility 里的組件一并,提供了 POP 的各項復雜計算的基本支持。
由此通過 Engine、Utility、WebCore 三個基石,打造了Animations。
三、Animation
1、POPAnimation 節選
- (id)init
{
[NSException raise:NSStringFromClass([self class]) format:@"Attempting to instantiate an abstract class. Use a concrete subclass instead."];
return nil;
}
- (id)_init
{
self = [super init];
if (nil != self) {
[self _initState];
}
return self;
}
- (void)_initState
{
_state = new POPAnimationState(self);
}
- (void)dealloc
{
if (_state) {
delete _state;
_state = NULL;
};
}
POPAnimation 是個抽象基類,也就是說說你不能直接用這個類new 一個對象,但是它提供了一個_init 方法。其中_state 結構體在匿名分類中定義,動畫的相關信息都在結構體中進行了定義。?POPAnimation主要實現的就是針對動畫狀態_state的存取,這樣的好處是子類可以隨時獲取動畫的狀態。當代碼看到這里時,有了兩個疑問:
1)@property(readonly,nonatomic) POPAnimationTracer *tracer; 這個屬性是干什么用的?
2)@property(weak,nonatomic)iddelegate; ?代理為什么沒有指定協議?
從POPAnimation類里找不到這兩個問題的答案,不過去找POPAnimationTracer這個類,可以解決第一個問題
/**
@abstract Tracer of animation events to facilitate unit testing & debugging.
*/
@interface POPAnimationTracer : NSObject
看注釋這個類是輔助單元測試和debug的。每個Animation過程擁有一個POPAnimationTracer,它以一種快速高效的方式允許你記錄所有的動畫相關事件,還允許你在動畫完成后對其進行查詢和分析。
關于第二個問題,從POPAnimation中無法直接明白,我們一會從他的子類里尋找答案。
2、POPPropertyAnimation
/**
@abstract The semi-concrete property animation subclass.
*/
@interface POPPropertyAnimation : POPAnimation
/**
@abstract The property to animate.
*/
@property (strong, nonatomic) POPAnimatableProperty *property;
/**
@abstract The value to animate from.
@discussion The value type should match the property. If unspecified, the value is initialized to the object's current value on animation start.
*/
@property (copy, nonatomic) id fromValue;
/**
@abstract The value to animate to.
@discussion The value type should match the property. If unspecified, the value is initialized to the object's current value on animation start.
*/
@property (copy, nonatomic) id toValue;