在iOS開發(fā)中拆讯,動畫可以說是美化App,提高App的交互效果的利器晴竞。So蛙卤,POP是FaceBook開源的一款動畫的第三方。近日稍微看了一下噩死,介紹一下簡單的入門級內(nèi)容颤难。
POP-進入你的項目
使用CocoaPod就十分簡單了。
pod 'pop', '~> 1.0'
POP-使用
POP有默認的三種動畫甜滨,和支持自定義動畫乐严。
- POPBasicAnimation 基礎(chǔ)動畫
- POPSpringAnimation 彈性動畫
- POPDecayAnimation 阻尼動畫
- POPCustomAnimation 自定義動畫
下面我們通過一步步的講解瘤袖,一步步的學習POP
POPBasicAnimation
POPBasicAnimation使用最廣泛 提供固定時間間隔的動畫(如淡入淡出效果)
入門級效果的解析衣摩,效果如下:
POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anBasic.fromValue = @(0);
anBasic.toValue = @(view.frame.origin.x + 200);
anBasic.beginTime = CACurrentMediaTime() + 1.0f;
anBasic.duration = 0.4f;
anBasic.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
[view.layer pop_addAnimation:anBasic forKey:@"position"];
熟悉POP的中有幾個概念。
PropertyNamed ---> kPOPLayerPositionX
表示這個動畫負責監(jiān)聽或者說動態(tài)變化的值
fromValue
表示這個動畫監(jiān)聽值的起始值
toValue
表示這個動畫監(jiān)聽值的結(jié)束值
beginTime
表示動畫的起始時間捂敌,+1.0f表示向后延時 1s
duration
表示動畫的持續(xù)時間
timingFunction
表示動畫的效果淡入淡出等
timingFunction 包括
- kCAMediaTimingFunctionLinear --- 線性動畫
- kCAMediaTimingFunctionEaseIn --- 淡入
- kCAMediaTimingFunctionEaseOut --- 淡出
- kCAMediaTimingFunctionEaseInEaseOut --- 先淡入再淡出
了解了上面的東西基本上就能看懂那段代碼了艾扮。
大體意思就是我,我定義了一個監(jiān)聽LayerX值的動畫占婉。然后設(shè)置一下X的起始位置泡嘴,結(jié)束位置,開始時間逆济,持續(xù)時間酌予,動畫效果磺箕。然后我這個動畫基本就定義好了。
接下來抛虫,我吧這個動畫添加到View的Layer上松靡。并給他一個Key(隨意)。
經(jīng)過這個建椰,你大體能夠理解POP該怎么寫動畫效果了雕欺。簡單方便,實用經(jīng)濟棉姐。
POPSpringAnimation
彈性動畫屠列,是很多人選擇POP的原因了吧。因為他有一些像彈簧一樣的效果伞矩。
先上效果:
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anim.toValue = @(view.frame.origin.x + 200);
anim.beginTime = CACurrentMediaTime() + 1.0f;
anim.springBounciness = 15.0f;
[view.layer pop_addAnimation:anim forKey:@"position"];
說一些SpringAnimation特有的屬性吧笛洛。
springBounciness:4.0 //[0-20] 彈力 越大則震動幅度越大
springSpeed :12.0 //[0-20] 速度 越大則動畫結(jié)束越快
dynamicsTension :0 //拉力 接下來這三個都跟物理力學模擬相關(guān) 數(shù)值調(diào)整起來也很費時 沒事不建議使用哈
dynamicsFriction:0 //摩擦 同上
dynamicsMass :0 //質(zhì)量 同上
POPDecayAnimation
阻尼動畫,顧名思義扭吁,動畫就像公交慢慢踩剎車一樣撞蜂,慢慢減速的動畫。
POPDecayAnimation *anDecay = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anDecay.velocity = @(view.frame.origin.x + 200);
anDecay.beginTime = CACurrentMediaTime();
anDecay.deceleration = 0.998;
[view.layer pop_addAnimation:anDecay forKey:@"position"];
效果自己可以試試侥袜,這里有一個注意點蝌诡。toValue
,Duration
設(shè)置將沒有什么意義。這個時候的運動值是根據(jù) velocity
,deceleration
計算出來的枫吧。
deceleration:0.998 //衰減系數(shù)(越小則衰減得越快)
POPAnimatablePropery
這個Propery就是監(jiān)聽的屬性值浦旱。
下面提供一個監(jiān)聽屬性表
/**
Common CALayer property names.
*/
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;
/**
Common CAShapeLayer property names.
*/
extern NSString * const kPOPShapeLayerStrokeStart;
extern NSString * const kPOPShapeLayerStrokeEnd;
extern NSString * const kPOPShapeLayerStrokeColor;
extern NSString * const kPOPShapeLayerFillColor;
/**
Common NSLayoutConstraint property names.
*/
extern NSString * const kPOPLayoutConstraintConstant;
#if TARGET_OS_IPHONE
/**
Common UIView property names.
*/
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;
/**
Common UIScrollView property names.
*/
extern NSString * const kPOPScrollViewContentOffset;
extern NSString * const kPOPScrollViewContentSize;
extern NSString * const kPOPScrollViewZoomScale;
extern NSString * const kPOPScrollViewContentInset;
/**
Common UITableView property names.
*/
extern NSString * const kPOPTableViewContentOffset;
extern NSString * const kPOPTableViewContentSize;
/**
Common UICollectionView property names.
*/
extern NSString * const kPOPCollectionViewContentOffset;
extern NSString * const kPOPCollectionViewContentSize;
/**
Common UINavigationBar property names.
*/
extern NSString * const kPOPNavigationBarBarTintColor;
/**
Common UIToolbar property names.
*/
extern NSString * const kPOPToolbarBarTintColor;
/**
Common UITabBar property names.
*/
extern NSString * const kPOPTabBarBarTintColor;
/**
Common UILabel property names.
*/
extern NSString * const kPOPLabelTextColor;
具體每一個屬性監(jiān)聽的代碼設(shè)置可以參考Git上面的例子。
POP Git Link
自定義POPAnimatableProperty
有些時候既有的Property可能滿足不了我們的需求九杂,這個時候我們可以自定義Property颁湖。
通過一個例子我們來講解一下。先上效果:
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(100, 200, 100, 50);
label.textColor = [UIColor blackColor];
[self.view addSubview:label];
POPAnimatableProperty *prop = [POPAnimatableProperty propertyWithName:@"countdown" initializer:^(POPMutableAnimatableProperty *prop) {
prop.writeBlock = ^(id obj, const CGFloat values[]) {
UILabel *lable = obj;
label.text = [NSString stringWithFormat:@"%02d:%02d:%02d",(int)values[0]/60,(int)values[0]%60,(int)(values[0]*100)%100];
};
prop.threshold = 0.01f;
}];
//
POPBasicAnimation *anBasic = [POPBasicAnimation linearAnimation]; //秒表當然必須是線性的時間函數(shù)
anBasic.property = prop; //自定義屬性
anBasic.fromValue = @(0); //從0開始
anBasic.toValue = @(3*60); //180秒
anBasic.duration = 180; //持續(xù)3分鐘
anBasic.beginTime = CACurrentMediaTime() + 1; //延遲1秒開始
[label pop_addAnimation:anBasic forKey:@"countdown"];
這個時候例隆,有些東西可以特殊解釋一下甥捺。
prop.writeBlock
這個是Animation中Value每次的變化都會調(diào)用這個回調(diào),然后就可以在這個Block里面做一些事情镀层,效果镰禾。
values
數(shù)組表示的是什么呢。在這個中Value是一個數(shù)值唱逢,就是Values[0].
然后如果Value
是一個CGRect
吴侦,那么values[0],values[1]坞古,values[2]备韧,values[3]
就分別對應(yīng) CGRectMake(0, 0, 20.0, 20.0)
的 0, 0, 20.0, 20.0
總結(jié)
POP動畫基礎(chǔ)入門就是這樣,想要深入可以看Git的官方文檔痪枫。
POP的文檔還是十分完備的织堂。