Pop 是一個可擴展的動畫引擎,可用於實現任意iOS對象的任意屬性的動態變化,支持通常動畫,彈性動畫和漸變更畫三種類型.ios
pod 'pop', '~> 1.0'
在須要使用POP的地方,引入頭文件:git
#import <pop/POP.h>
把動畫添加到你想要擁有動態變化的對象上面,便可開始動畫:github
POPSpringAnimation *anim = [POPSpringAnimation animation]; ... [layer pop_addAnimation:anim forKey:@"myKey"];
能夠根據開始動畫時傳入的鍵,來移除對應的動畫:objective-c
[layer pop_removeAnimationForKey:@"myKey"];
開始動畫時傳入的鍵,也能夠用來查詢是否存在某個動畫.更新一個正在執行的動畫的 toValue,能夠無縫實現動畫效果間的過渡:ruby
anim = [layer pop_animationForKey:@"myKey"]; if (anim) { /* 更新toValue爲一個新值. */ anim.toValue = @(42.0); } else { /* 建立並開始一個新的動畫. */ .... }
上面的例子是以圖層爲例.Pop是以NSObject的擴展方式實現的.也就是說: 任何NSObject及其子類均可以經過Pop添加動畫效果.框架
有四種動畫類型: 彈性動畫,漸弱動畫,基礎動畫和自定義動畫.ide
彈性動畫,能夠給對象一個有活力的彈跳效果.下面的例子中,咱們使用彈性動畫來使圖層的邊框值從它的當前值變化爲(0, 0 ,400, 400):工具
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds]; anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)]; [layer pop_addAnimation:anim forKey:@"size"];
漸變更畫,可讓對象緩慢地中止變化.下面的例子,咱們使圖層的橫座標從當前值以1000像素每秒的速度漸變:動畫
POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX]; anim.velocity = @(1000.); [layer pop_addAnimation:anim forKey:@"slide"];
基礎動畫能夠用來在指定的時間段動態改變屬性的值.在默認的時間週期內動態讓視圖的透明度從0.0變化到1.0來實現淡入的效果:code
POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha]; anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; anim.fromValue = @(0.0); anim.toValue = @(1.0); [view pop_addAnimation:anim forKey:@"fade"];
POPCustomAnimation
用來建立自定義動畫和過渡效果.它經過管理 CADisplayLink 來管理時間與動畫的關聯性.更多細節,詳見頭文件.
動畫屬性由POPAnimatableProperty
類管理,用來指定在哪一個屬性上應用動畫效果.在下面的例子中,咱們建立了一個彈性動畫,而且顯示設置動畫屬性爲與-[CALayer bounds]
對應的屬性:
POPSpringAnimation *anim = [POPSpringAnimation animation]; anim.property = [POPAnimatableProperty propertyWithName:kPOPLayerBounds];
這個框架愛預先實現了了許多圖層和視圖共用的動畫屬性,你能夠在本身的項目中直接使用.你也能夠經過建立POPAnimatableProperty
類的實例,來建立一個自定義的動畫屬性.下面的例子中,咱們定義了一個自定義的volume動畫屬性:
prop = [POPAnimatableProperty propertyWithName:@"com.foo.radio.volume" initializer:^(POPMutableAnimatableProperty *prop) { // 讀取動畫屬性的值 prop.readBlock = ^(id obj, CGFloat values[]) { values[0] = [obj volume]; }; // 設置動畫屬性的值. prop.writeBlock = ^(id obj, const CGFloat values[]) { [obj setVolume:values[0]]; }; // 力學上的臨界值 prop.threshold = 0.01; }]; anim.property = prop;
系統預約義的動畫屬性也是由上面例子的機制定義的,自定義動畫屬性時,頗有借鑑價值.完整的預約義的動畫屬性列表和他們實現的具體細節參見POPAnimatableProperty.h
:
/** 圖層(CALayer)通用動畫屬性. */ extern NSString * const kPOPLayerBackgroundColor; extern NSString * const kPOPLayerBounds; extern NSString * const kPOPLayerCornerRadius; extern NSString * const kPOPLayerBorderWidth; extern NSString * const kPOPLayerBorderColor; extern NSString * const kPOPLayerOpacity; extern NSString * const kPOPLayerPosition; extern NSString * const kPOPLayerPositionX; extern NSString * const kPOPLayerPositionY; extern NSString * const kPOPLayerRotation; extern NSString * const kPOPLayerRotationX; extern NSString * const kPOPLayerRotationY; extern NSString * const kPOPLayerScaleX; extern NSString * const kPOPLayerScaleXY; extern NSString * const kPOPLayerScaleY; extern NSString * const kPOPLayerSize; extern NSString * const kPOPLayerSubscaleXY; extern NSString * const kPOPLayerSubtranslationX; extern NSString * const kPOPLayerSubtranslationXY; extern NSString * const kPOPLayerSubtranslationY; extern NSString * const kPOPLayerSubtranslationZ; extern NSString * const kPOPLayerTranslationX; extern NSString * const kPOPLayerTranslationXY; extern NSString * const kPOPLayerTranslationY; extern NSString * const kPOPLayerTranslationZ; extern NSString * const kPOPLayerZPosition; extern NSString * const kPOPLayerShadowColor; extern NSString * const kPOPLayerShadowOffset; extern NSString * const kPOPLayerShadowOpacity; extern NSString * const kPOPLayerShadowRadius; /** 圖形層(CAShapeLayer)通用動畫屬性. */ extern NSString * const kPOPShapeLayerStrokeStart; extern NSString * const kPOPShapeLayerStrokeEnd; extern NSString * const kPOPShapeLayerStrokeColor; extern NSString * const kPOPShapeLayerFillColor; /** 視圖約束(NSLayoutConstraint)通用動畫屬性. */ extern NSString * const kPOPLayoutConstraintConstant; /** 視圖(UIView)通用動畫屬性. */ extern NSString * const kPOPViewAlpha; extern NSString * const kPOPViewBackgroundColor; extern NSString * const kPOPViewBounds; extern NSString * const kPOPViewCenter; extern NSString * const kPOPViewFrame; extern NSString * const kPOPViewScaleX; extern NSString * const kPOPViewScaleXY; extern NSString * const kPOPViewScaleY; extern NSString * const kPOPViewSize; extern NSString * const kPOPViewTintColor; /** 滾動視圖(UIScrollView)通用動畫屬性. */ extern NSString * const kPOPScrollViewContentOffset; extern NSString * const kPOPScrollViewContentSize; extern NSString * const kPOPScrollViewZoomScale; extern NSString * const kPOPScrollViewContentInset; /** 列表(UITableView)通用動畫屬性. */ extern NSString * const kPOPTableViewContentOffset; extern NSString * const kPOPTableViewContentSize; /** 集合視圖(UICollectionView)通用動畫屬性. */ extern NSString * const kPOPCollectionViewContentOffset; extern NSString * const kPOPCollectionViewContentSize; /** 導航欄(UINavigationBar)通用動畫屬性. */ extern NSString * const kPOPNavigationBarBarTintColor; /** 工具欄(UIToolBar)通用動畫屬性. */ extern NSString * const kPOPToolbarBarTintColor; /** 標籤欄(UITabBar)通用動畫屬性. */ extern NSString * const kPOPTabBarBarTintColor; /** 標籤(UILabel)通用動畫屬性. */ extern NSString * const kPOPLabelTextColor;