Pop–實現任意iOS對象的任意屬性的動態變化,popios
簡介
Pop 是一個可擴充的動畫引擎,可用於實現任意iOS對象的任意屬性的動態變化,支援一般動畫,彈性動畫和漸層動畫三種類型.
項目首頁: pop
最新樣本: 點擊下載
注意: 官方代碼中,並不包含執行個體,而是用於編譯的所有原始碼,建議自行建立工程,並結合下文的程式碼片段查看效果.
入門安裝通過CocoaPods安裝
pod 'pop', '~> 1.0'
使用
在需要使用POP的地方,引入標頭檔:
#import <pop/POP.h>
動畫的開始,停止 與 更新
把動畫添加到你想要擁有動態變化的對象上面,即可開始動畫:
POPSpringAnimation *anim = [POPSpringAnimation animation];...[layer pop_addAnimation:anim forKey:@"myKey"];
可以根據開始動畫時傳入的鍵,來移除對應的動畫:
[layer pop_removeAnimationForKey:@"myKey"];
開始動畫時傳入的鍵,也可以用來查詢是否存在某個動畫.更新一個正在執行的動畫的 toValue,可以無縫實現動畫效果間的過渡:
anim = [layer pop_animationForKey:@"myKey"];if (anim) { /* 更新toValue為一個新值. */ anim.toValue = @(42.0);} else { /* 建立並開始一個新的動畫. */ ....}
上面的例子是以圖層為例.Pop是以NSObject的擴充方式實現的.也就是說: 任何NSObject及其子類都可以通過Pop添加動畫效果.
動畫類型
有四種動畫類型: 彈性動畫,漸弱動畫,基礎動畫和自訂動畫.
彈性動畫
彈性動畫,可以給對象一個有活力的彈跳效果.下面的例子中,我們使用彈性動畫來使圖層的邊框值從它的當前值變化為(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來實現淡入的效果:
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;