Pop–實現任意iOS對象的任意屬性的動態變化

pop

簡介

Pop 是一個可擴展的動畫引擎,可用於實現任意iOS對象的任意屬性的動態變化,支持通常動畫,彈性動畫和漸變更畫三種類型.ios

  • 項目主頁: pop
  • 最新示例: 點擊下載
  • 注意: 官方代碼中,並不包含實例,而是用於編譯的全部源代碼,建議自行新建工程,並結合下文的代碼片斷查看效果.

入門

安裝

經過CocoaPods安裝

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;
相關文章
相關標籤/搜索