最近工作中需要做一些关于动画的功能,虽然功能本身不会运用到POP动画,但是在敲代码的时候想到了之前想要调研的facebook程序员开发的引擎级别的POP动画框架,闲下来的时候琢磨了一下,发现这个库功能非常强大,对于App**逼格**提升有很大帮助.
第一次看POP实现的动画时感觉很像Foundation框架自带的CoreAnimation动画,但仔细看了相关资料和自己实践了几个Demo之后,感觉POP相对于CoreAnimation级别的动画来讲实现的效果更佳细腻,而且支持自定义属性,前边说到是引擎级别,因为库中加入了很多物理学相关的属性可供使用.
使用:
一. 导入:
1.可以使用cocoaPod来导入POP库,在pod中写入
pod 'pop', '~> 1.0'
然后
pod install
2. 直接把库文件放入工程文件夹,这种方式需要在使用POP的类中导入头文件#import POP/POP.h
,Swift版本需要创建bridge.h文件,并在bridge.h中引入POP库
二. 使用:
POP库提供了四种动画形式:
一. Basic动画:
@IBAction func basicButton(sender: AnyObject) {
//创建POPBasic对象 propertyName是需要修改的属性名称
let basicAnimate = POPBasicAnimation.init(propertyNamed: kPOPLayerCornerRadius)
//fromValue,toValue分别是动画的起始位置和目标位置的值
//如果需求换成水平移动 那么需要改变的参数为: propertyName,fromValue,toValue.
//fromValue如果不设置 默认为要改变的属性的初始值
basicAnimate.fromValue = 0.0
basicAnimate.toValue = self.animationView.bounds.width/2.0
//repeatCount 重复次数
basicAnimate.repeatCount = 2
//duration 动画的持续时长
basicAnimate.duration = 2
//这里的timingFunction是指动画的线性属性 比如先快后慢,先慢后快
basicAnimate.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
//把POPBasic对象添加到View上
self.animationView.pop_addAnimation(basicAnimate, forKey: "basicCornerRadius")
}
二.
Spring动画(非常酷炫)
@IBAction func springButton(sender: AnyObject) {
let springAnimation = POPSpringAnimation(propertyNamed: kPOPLayerCornerRadius)
//velocity 添加动画的速度 也可以理解为力度
springAnimation.velocity = 10
//springBounciness 动画的弹力属性 这个属性给动画提供了欠阻尼效果
springAnimation.springBounciness = 10
// spring动画还有很多物理学相关的属性 例如拉力,摩擦力,重力 这些会在下一次文档中实现
self.animationView.pop_addAnimation(springAnimation, forKey: "springAnimation")
}
三: decay动画
@IBAction func decayButton(sender: AnyObject) {
let decayAnimiation = POPDecayAnimation(propertyNamed: kPOPLayerCornerRadius)
//decay动画的持续时间同样是动态计算得到的
//deceleration是decay动画中比较重要的属性 它提供了与spring动画相反的过阻尼效果
decayAnimiation.deceleration = 10
//提供动画的初始值,目标值
decayAnimiation.fromValue = 0
decayAnimiation.toValue = self.animationView.bounds.width/2
self.animationView.pop_addAnimation(decayAnimiation, forKey: "decayAnimation")
}
大家会注意在把动画效果添加到view上的时候,会有一个key
我们可以对这个key进行操作,比如:
self.animationView.pop_removeAnimationForKey("springAnimation")
或者通过removeAll来把整个页面的POP动画效果移除
那么通过POP动画能够修改那些属性呢?
这里是库里给出的list:
/**
Common CALayer property names.
*/
public let kPOPLayerBackgroundColor: String
public let kPOPLayerBounds: String
public let kPOPLayerCornerRadius: String
public let kPOPLayerBorderWidth: String
public let kPOPLayerBorderColor: String
public let kPOPLayerOpacity: String
public let kPOPLayerPosition: String
public let kPOPLayerPositionX: String
public let kPOPLayerPositionY: String
public let kPOPLayerRotation: String
public let kPOPLayerRotationX: String
public let kPOPLayerRotationY: String
public let kPOPLayerScaleX: String
public let kPOPLayerScaleXY: String
public let kPOPLayerScaleY: String
public let kPOPLayerSize: String
public let kPOPLayerSubscaleXY: String
public let kPOPLayerSubtranslationX: String
public let kPOPLayerSubtranslationXY: String
public let kPOPLayerSubtranslationY: String
public let kPOPLayerSubtranslationZ: String
public let kPOPLayerTranslationX: String
public let kPOPLayerTranslationXY: String
public let kPOPLayerTranslationY: String
public let kPOPLayerTranslationZ: String
public let kPOPLayerZPosition: String
public let kPOPLayerShadowColor: String
public let kPOPLayerShadowOffset: String
public let kPOPLayerShadowOpacity: String
public let kPOPLayerShadowRadius: String
/**
Common CAShapeLayer property names.
*/
public let kPOPShapeLayerStrokeStart: String
public let kPOPShapeLayerStrokeEnd: String
public let kPOPShapeLayerStrokeColor: String
public let kPOPShapeLayerFillColor: String
public let kPOPShapeLayerLineWidth: String
public let kPOPShapeLayerLineDashPhase: String
/**
Common NSLayoutConstraint property names.
*/
public let kPOPLayoutConstraintConstant: String
/**
Common UIView property names.
*/
public let kPOPViewAlpha: String
public let kPOPViewBackgroundColor: String
public let kPOPViewBounds: String
public let kPOPViewCenter: String
public let kPOPViewFrame: String
public let kPOPViewScaleX: String
public let kPOPViewScaleXY: String
public let kPOPViewScaleY: String
public let kPOPViewSize: String
public let kPOPViewTintColor: String
/**
Common UIScrollView property names.
*/
public let kPOPScrollViewContentOffset: String
public let kPOPScrollViewContentSize: String
public let kPOPScrollViewZoomScale: String
public let kPOPScrollViewContentInset: String
public let kPOPScrollViewScrollIndicatorInsets: String
/**
Common UITableView property names.
*/
public let kPOPTableViewContentOffset: String
public let kPOPTableViewContentSize: String
/**
Common UICollectionView property names.
*/
public let kPOPCollectionViewContentOffset: String
public let kPOPCollectionViewContentSize: String
/**
Common UINavigationBar property names.
*/
public let kPOPNavigationBarBarTintColor: String
/**
Common UIToolbar property names.
*/
public let kPOPToolbarBarTintColor: String
/**
Common UITabBar property names.
*/
public let kPOPTabBarBarTintColor: String
/**
Common UILabel property names.
*/
public let kPOPLabelTextColor: String
我们可以看到在对应不同控件,不同的层级都有相对应的属性可以使用,如果你想,你甚至可以使用POP库来创建出一个自定义的ScrollView.
总结:
POP动画库是一个非常值得研究的第三方库,如果上面三种效果还不能满足需求,我们可以尝试使用自定义属性.下篇文章中我会进行更多的尝试和探索.