Facebook开源动画库 POP-POPBasicAnimation运用

动画在APP开发过程中还是经常出现,将花几天的时间对Facebook开源动画库 POP进行简单的学习;本文主要针对的是POPBasicAnimation运用;实例源代码已经上传至gitHub,地址:https://github.com/wujunyang/facebookPopTest

Pop Github : https://github.com/facebook/pop

Pop比较全的实例:https://github.com/kevinzhow/pop-handapp

Popping -Pop案例 : https://github.com/schneiderandre/popping

心跳案例POP:https://github.com/hanzhen/MiniMatch-iOS

POP使用教程: https://github.com/maxmyers/FacebookPop

 

POP默认支持三种动画 但同时也支持自定义动画

POPBasicAnimation //基本动画

POPSpringAnimation //类似弹簧一般的动画效果

POPDecayAnimation //过阻尼效果,衰减效果

POPCustomAnimation //自定义动画

 

一:POPBasicAnimation运用

实例1:创建一个动画效果,关于视图透明度的变化,从全透明经过五秒的时间变成alpha为1的不透明效果;此处运用到的POPBasicAnimation类;

- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor=[UIColor whiteColor];//1:初始化一个视图块if (self.myView==nil) {self.myView=[[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];self.myView.backgroundColor=[UIColor redColor];self.myView.alpha=0;[self.view addSubview:self.myView];}//创建一个POPBasicAnimation动画POPBasicAnimation *basicAnimation=[POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];basicAnimation.fromValue=@(0);basicAnimation.toValue=@(1);basicAnimation.duration=5; //设置动画的间隔时间 默认是0.4秒basicAnimation.repeatCount=HUGE_VALF; //重复次数 HUGE_VALF设置为无限次重复[self.myView pop_addAnimation:basicAnimation forKey:@"myViewAnimation"];
}

其实POP创建动画的步骤分为三步,a:创建相应的动画类 b:增加相应的属性 c:附加到相应的对象上;

上面实例中kPOPViewAlpha是POP为我们封装好的一个关于透明度的动画效果;加上属性就满足我们的要求;从而也引出POP中一个很关键的类POPAnimatableProperty,里面定义的一些常量在今后的运用中非常关键;

我们可以简单看一下POPAnimatableProperty里面定义的一些常量,因为主要针对IOS方面,所以就选出IOS相关的内容:

/**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;
extern NSString * const kPOPShapeLayerLineWidth;
extern NSString * const kPOPShapeLayerLineDashPhase;/**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;
extern NSString * const kPOPScrollViewScrollIndicatorInsets;/**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;#else/**Common NSView property names.*/
extern NSString * const kPOPViewFrame;
extern NSString * const kPOPViewBounds;
extern NSString * const kPOPViewAlphaValue;
extern NSString * const kPOPViewFrameRotation;
extern NSString * const kPOPViewFrameCenterRotation;
extern NSString * const kPOPViewBoundsRotation;/**Common NSWindow property names.*/
extern NSString * const kPOPWindowFrame;
extern NSString * const kPOPWindowAlphaValue;
extern NSString * const kPOPWindowBackgroundColor;#endif

其实常量对应到其每个UIKIT的一个属性上,下面把部分列出来,就可以了解到动画效果是针对什么属性进行

NSString * const kPOPLayerBackgroundColor = @"backgroundColor";  //背景色
NSString * const kPOPLayerBounds = @"bounds";  //坐标
NSString * const kPOPLayerCornerRadius = @"cornerRadius";  //圆形 值越大,角就越圆
NSString * const kPOPLayerBorderWidth = @"borderWidth";  //边框宽度
NSString * const kPOPLayerBorderColor = @"borderColor";  //边框色
NSString * const kPOPLayerOpacity = @"opacity"; //透明度
NSString * const kPOPLayerPosition = @"position"; //位置 position是相对于屏幕的
NSString * const kPOPLayerPositionX = @"positionX";
NSString * const kPOPLayerPositionY = @"positionY";
NSString * const kPOPLayerRotation = @"rotation"; //旋转
NSString * const kPOPLayerRotationX = @"rotationX";
NSString * const kPOPLayerRotationY = @"rotationY";
NSString * const kPOPLayerScaleX = @"scaleX"; //缩放系数
NSString * const kPOPLayerScaleXY = @"scaleXY"; //XY缩放系数
NSString * const kPOPLayerScaleY = @"scaleY"; //Y缩放系数
NSString * const kPOPLayerSize = @"size";  //大小
NSString * const kPOPLayerSubscaleXY = @"subscaleXY";
NSString * const kPOPLayerSubtranslationX = @"subtranslationX";
NSString * const kPOPLayerSubtranslationXY = @"subtranslationXY";
NSString * const kPOPLayerSubtranslationY = @"subtranslationY";
NSString * const kPOPLayerSubtranslationZ = @"subtranslationZ";
NSString * const kPOPLayerTranslationX = @"translationX"; //X轴平移量
NSString * const kPOPLayerTranslationXY = @"translationXY"; //XY轴平移量
NSString * const kPOPLayerTranslationY = @"translationY"; //Y轴平移量
NSString * const kPOPLayerTranslationZ = @"translationZ"; //Z轴平移量
NSString * const kPOPLayerZPosition = @"zPosition";  //遮挡属性
NSString * const kPOPLayerShadowColor = @"shadowColor"; //设置阴影
NSString * const kPOPLayerShadowOffset = @"shadowOffset"; //阴影偏移
NSString * const kPOPLayerShadowOpacity = @"shadowOpacity"; //阴影透明度
NSString * const kPOPLayerShadowRadius = @"shadowRadius"; //阴影半径// CAShapeLayer
NSString * const kPOPShapeLayerStrokeStart = @"shapeLayer.strokeStart";//strokeStart  动画的fromValue = 0,toValue = 1 表示从路径的0位置画到1 怎么画是按照清除开始的位置也就是清除0 一直清除到1 效果就是一条路径慢慢的消失  strokeStart  动画的fromValue = 1,toValue = 0 表示从路径的1位置画到0 怎么画是按照清除开始的位置也就是1 这样开始的路径是空的(即都被清除掉了)一直清除到0 效果就是一条路径被反方向画出来
NSString * const kPOPShapeLayerStrokeEnd = @"shapeLayer.strokeEnd";// strokeEnd  动画的fromValue = 0,toValue = 1  表示 这里我们分3个点说明动画的顺序  strokeEnd从结尾开始清除 首先整条路径先清除后2/3,接着清除1/3 效果就是正方向画出路径     strokeEnd  动画的fromValue = 1,toValue = 0 效果就是反方向路径慢慢消失
NSString * const kPOPShapeLayerStrokeColor = @"shapeLayer.strokeColor";  //画笔的色
NSString * const kPOPShapeLayerFillColor = @"shapeLayer.fillColor";
NSString * const kPOPShapeLayerLineWidth = @"shapeLayer.lineWidth"; //线的宽度
NSString * const kPOPShapeLayerLineDashPhase = @"shapeLayer.lineDashPhase";

从上面的源代码不难发现,其实针对不同的UIKit都有一些相应的常量,比如在UIView中就有我们上面实例中出现的kPOPViewAlpha;因为POP动画是针对对象的,所以很多的控件都可以做出相应的动画效果;CALayer、CAShapeLayer、UIView中相关的常量大部分控件都可以使用;注意像常量kPOPLayerRotation它是作用在层上,所以我们在使用时要把它加载到相应视图的layer上面;

实例2:创建一个动画效果,实现一个视图在延迟2s后经过5秒的时间X轴从50移到300位置的动画效果;

//2:初始化一个视图块if (self.myXView==nil) {self.myXView=[[UIView alloc]initWithFrame:CGRectMake(50, 210, 50, 50)];self.myXView.backgroundColor=[UIColor blueColor];[self.view addSubview:self.myXView];}//创建一个POPBasicAnimation动画 X轴的变化 从50移到300位置POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionX];anBasic.toValue = @(300);anBasic.beginTime = CACurrentMediaTime() + 2.0f; //可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间anBasic.duration=5;//设置动画的间隔时间 默认是0.4秒[self.myXView pop_addAnimation:anBasic forKey:@"myBackColorViewAnimation”];

实例3:创建一个动画效果,实现视图的背影色经过5秒后从黑色变成黄色的动画效果;

 //3:初始化一个视图块if (self.myBackColorView==nil) {self.myBackColorView=[[UIView alloc]initWithFrame:CGRectMake(250, 100, 50, 50)];self.myBackColorView.backgroundColor=[UIColor blackColor];[self.view addSubview:self.myBackColorView];}//创建一个POPBasicAnimation动画 视图的背影色从黑色经过5秒后渐进变成黄色POPBasicAnimation *anBackGroundBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPViewBackgroundColor];anBackGroundBasic.toValue=[UIColor yellowColor];anBackGroundBasic.duration=5;[self.myBackColorView pop_addAnimation:anBackGroundBasic forKey:@"myBackColorViewAnimation”];

从上面三个实例可以发现,其实toValue或FormValue的值都是根据动画属性类型来定义,因为它们都是id型;这也决定它们可以是任何类型的值,只要符合我们要求就行;

除了上面那些常用的属性外,还有一个运行CAMediaTimingFunction:速度控制函数属性;四种如下:

kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉

kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开

kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地

kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。

实例4:创建一个POPBasicAnimation动画 视图中心以kCAMediaTimingFunctionLinear直线运行到中心点为100,64

    //4:初始化一个视图块if (self.mytimingFunctionLinearView==nil) {self.mytimingFunctionLinearView=[[UIView alloc]initWithFrame:CGRectMake(0, 300, 50, 50)];self.mytimingFunctionLinearView.backgroundColor=[UIColor greenColor];[self.view addSubview:self.mytimingFunctionLinearView];}//创建一个POPBasicAnimation动画 视图中心以kCAMediaTimingFunctionLinear直线运行到中心点为100,64POPBasicAnimation *anLinearBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];anLinearBasic.toValue=[NSValue valueWithCGPoint:CGPointMake(100, 64)];anLinearBasic.duration=5;anLinearBasic.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];[self.mytimingFunctionLinearView pop_addAnimation:anLinearBasic forKey:@"myLinearBasic"];

实例5:创建一个POPBasicAnimation动画 视图中心以kCAMediaTimingFunctionEaseInEaseOut直线运行到中心点为200,64

    //5:初始化一个视图块if (self.mytimingFunctionEaseInEaseOutView==nil) {self.mytimingFunctionEaseInEaseOutView=[[UIView alloc]initWithFrame:CGRectMake(100, 300, 50, 50)];self.mytimingFunctionEaseInEaseOutView.backgroundColor=[UIColor grayColor];[self.view addSubview:self.mytimingFunctionEaseInEaseOutView];}//创建一个POPBasicAnimation动画 视图中心以kCAMediaTimingFunctionEaseInEaseOut直线运行到中心点为200,64POPBasicAnimation *anEaseInEaseOutBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];anEaseInEaseOutBasic.toValue=[NSValue valueWithCGPoint:CGPointMake(200, 64)];anEaseInEaseOutBasic.duration=5;anEaseInEaseOutBasic.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];[self.mytimingFunctionEaseInEaseOutView pop_addAnimation:anEaseInEaseOutBasic forKey:@"mytimingFunctionEaseInEaseOutView”];

POP比较好的一点是保留了动画结束后的状态,通过block回调。如下面的实例视图块的大小会被变成100*100

实例6:创建一个POPBasicAnimation动画 让视图块的大小从50*50 慢慢变到100*100

    //6:初始化一个视图块if (self.mySizeView==nil) {self.mySizeView=[[UIView alloc]initWithFrame:CGRectMake(250, 300, 50, 50)];self.mySizeView.backgroundColor=[UIColor redColor];[self.view addSubview:self.mySizeView];}//创建一个POPBasicAnimation动画 让视图块的大小从50*50 慢慢变到100*100POPBasicAnimation *ansizeBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPViewSize];ansizeBasic.toValue=[NSValue valueWithCGSize:CGSizeMake(100, 100)];ansizeBasic.duration=5;ansizeBasic.repeatCount=HUGE_VALF;[self.mySizeView pop_addAnimation:ansizeBasic forKey:@"mySizeView”];

setCompletionBlock可以在动画完成后做一些其它的操作;

实例7:创建一个POPBasicAnimation动画 让视图块的大小从60*30 慢慢变到100*100  动画完成后又有一个动画变成60*30

    //7:初始化一个Labelif (self.myLabel==nil) {self.myLabel=[[UILabel alloc]initWithFrame:CGRectMake(50, 300, 60, 30)];self.myLabel.backgroundColor=[UIColor redColor];self.myLabel.textAlignment=NSTextAlignmentCenter;self.myLabel.textColor=[UIColor whiteColor];self.myLabel.alpha=1;self.myLabel.text=@"Label";[self.view addSubview:self.myLabel];}//创建一个POPBasicAnimation动画 让视图块的大小从60*30 慢慢变到100*100  动画完成后又有一个动画变成60*30POPBasicAnimation* anLabelBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPViewSize];anLabelBasic.duration=3.0;anLabelBasic.toValue = [NSValue valueWithCGSize:CGSizeMake(100, 100)];anLabelBasic.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];[anLabelBasic setCompletionBlock:^(POPAnimation *ani, BOOL fin) {if (fin) {NSLog(@"self.myLabel.frame=%@",NSStringFromCGRect(self.myLabel.frame));POPBasicAnimation *newLabelAnimation=[POPBasicAnimation animationWithPropertyNamed:kPOPViewSize];newLabelAnimation.duration=3.0;newLabelAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(60, 30)];newLabelAnimation.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];[self.myLabel pop_addAnimation:newLabelAnimation forKey:@"newMyLabelAnimation"];}}];[self.myLabel pop_addAnimation:anLabelBasic forKey:@"myLabelAnimation"];

实例8:增加一个动画 类似心跳的效果,把动画封装在方法里面,方便进行递归调用;

@property(nonatomic)CALayer *myCriLayer;
@property (nonatomic) BOOL animated;初始化代码://8:初始化一个CALayer层if (self.myCriLayer==nil) {self.myCriLayer=[CALayer layer];[self.myCriLayer pop_removeAllAnimations];self.myCriLayer.opacity = 1.0;self.myCriLayer.transform = CATransform3DIdentity;[self.myCriLayer setMasksToBounds:YES];[self.myCriLayer setBackgroundColor:[UIColor colorWithRed:0.16 green:0.72 blue:1 alpha:1].CGColor];[self.myCriLayer setCornerRadius:15.0f];[self.myCriLayer setBounds:CGRectMake(0.0f, 0.0f, 30.0f, 30.0f)];self.myCriLayer.position = CGPointMake(self.view.center.x, 380.0);[self.view.layer addSublayer:self.myCriLayer];}//增加一个动画 类似心跳的效果
    [self performAnimation];把动画封装在方法里面,方便进行递归调用;-(void)performAnimation
{[self.myCriLayer pop_removeAllAnimations];POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY];if (self.animated) {anim.toValue = [NSValue valueWithCGPoint:CGPointMake(1.0, 1.0)];}else{anim.toValue = [NSValue valueWithCGPoint:CGPointMake(2.0, 2.0)];}anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];  //不同的类型 心跳会不一样
    self.animated = !self.animated; //使每次都有区别
    anim.completionBlock = ^(POPAnimation *anim, BOOL finished) {if (finished) {[self performAnimation];  //当动画结束后又递归调用,让它产生一种心跳的效果
        }};[self.myCriLayer pop_addAnimation:anim forKey:@"Animation"];
}

这样的方式可以在今后很多重复的动画中进行递归运用;

对于forKey是为了可以管理相应的动画,比如移除动画之类的,可以简单了解一下官方的实例

POPSpringAnimation *anim = [POPSpringAnimation animation];
...
[layer pop_addAnimation:anim forKey:@"myKey”];移除:[layer pop_removeAnimationForKey:@"myKey”];

也可以删除这个上面所有的动画:

[layer pop_removeAllAnimations];可以判断是否存在 anim
= [layer pop_animationForKey:@"myKey"]; if (anim) {/* update to value to new destination */anim.toValue = @(42.0); } else {/* create and start a new animation */.... }

当添加类似[myView pop_addAnimation:animation forKey:@"myKey"];的动画时,如果你用相同的key添加其他动画,那么新添加的动画将会取代先前的动画。

二:Pop Animation相比于Core Animation的优点

Pop Animation应用于CALayer时,在动画运行的任何时刻,layer和其presentationLayer的相关属性值始终保持一致,而Core Animation做不到。

Pop Animation可以应用任何NSObject的对象,而Core Aniamtion必须是CALayer。

三:相关属性的值

一:View Properties1:Alpha - kPOPViewAlphaPOPBasicAnimation *basicAnimation = [POPBasicAnimation animation];
basicAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewAlpha];
basicAnimation.toValue= @(0); // scale from 0 to 1

2:Color - kPOPViewBackgroundColorPOPSpringAnimation *basicAnimation = [POPSpringAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPViewBackgroundColor]; basicAnimation.toValue= [UIColor redColor];
3:Size
- kPOPViewBoundsPOPBasicAnimation *basicAnimation = [POPBasicAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewBounds]; basicAnimation.toValue=[NSValue valueWithCGRect:CGRectMake(0, 0, 90, 190)]; //first 2 values dont matter
4:Center - kPOPViewCenterPOPBasicAnimation *basicAnimation = [POPBasicAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewCenter]; basicAnimation.toValue=[NSValue valueWithCGPoint:CGPointMake(200, 200)];
5:Location
& Size - kPOPViewFramePOPBasicAnimation *basicAnimation = [POPBasicAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewFrame]; basicAnimation.toValue=[NSValue valueWithCGRect:CGRectMake(140, 140, 140, 140)];
6:Size
- kPOPViewScaleXYPOPBasicAnimation *basicAnimation = [POPBasicAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewScaleXY]; basicAnimation.toValue=[NSValue valueWithCGSize:CGSizeMake(3, 2)];
7:Size(Scale)
- kPOPViewSizePOPBasicAnimation *basicAnimation = [POPBasicAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewSize]; basicAnimation.toValue=[NSValue valueWithCGSize:CGSizeMake(30, 200)];
二:Layer Properties1:Color
- kPOPLayerBackgroundColorPOPSpringAnimation *basicAnimation = [POPSpringAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPLayerBackgroundColor]; basicAnimation.toValue= [UIColor redColor];
2:Size
- kPOPLayerBoundsPOPSpringAnimation *basicAnimation = [POPSpringAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPLayerBounds]; basicAnimation.toValue= [NSValue valueWithCGRect:CGRectMake(0, 0, 90, 90)]; //first 2 values dont matter
3:Size - kPOPLayerScaleXYPOPBasicAnimation *basicAnimation = [POPBasicAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPLayerScaleXY]; basicAnimation.toValue= [NSValue valueWithCGSize:CGSizeMake(2, 1)];//increases width and height scales
4:Size - kPOPLayerSizePOPBasicAnimation *basicAnimation = [POPBasicAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName:kPOPLayerSize]; basicAnimation.toValue= [NSValue valueWithCGSize:CGSizeMake(200, 200)];
5:Opacity
- kPOPLayerOpacityPOPSpringAnimation *basicAnimation = [POPSpringAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPLayerOpacity]; basicAnimation.toValue = @(0);
6:Position
- kPOPLayerPositionPOPSpringAnimation *basicAnimation = [POPSpringAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPLayerPosition]; basicAnimation.toValue= [NSValue valueWithCGRect:CGRectMake(130, 130, 0, 0)];//last 2 values dont matter
7:X Position - kPOPLayerPositionXPOPSpringAnimation *basicAnimation = [POPSpringAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPLayerPositionX]; basicAnimation.toValue= @(240);
8:Y Position
- kPOPLayerPositionYPOPSpringAnimation *anim = [POPSpringAnimation animation]; anim.property=[POPAnimatableProperty propertyWithName:kPOPLayerPositionY]; anim.toValue = @(320);
9:Rotation
- kPOPLayerRotationPOPSpringAnimation *basicAnimation = [POPSpringAnimation animation]; basicAnimation.property = [POPAnimatableProperty propertyWithName: kPOPLayerRotation]; basicAnimation.toValue= @(M_PI/4); //2 M_PI is an entire rotation

 

 

最近有个妹子弄的一个关于扩大眼界跟内含的订阅号,每天都会更新一些深度内容,在这里如果你感兴趣也可以关注一下(嘿对美女跟知识感兴趣),当然可以关注后输入:github 会有我的微信号,如果有问题你也可以在那找到我;当然不感兴趣无视此信息;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux sed删除指定行_shell三剑客之sed!

背景sed(Stream Editor 流编辑器),作为三剑客的一份子,主要的功能有增删改查。为什么称之为“流”编辑器呢?大家知道:在Linux文件系统中,一切都可以作为文件来处理。比如:配置文件、设备文件、日志等等。se…

linux cpu使用率1200%,linux下用top命令查看cpu利用率超过100%

今天跑了一个非常耗时的批量插入操作。。通过top命令查看cpu以及内存的使用的时候,cpu的时候查过了120%。。以前没注意。。通过在top的情况下按大键盘的1,查看的cpu的核数为4核。通过网上查找,发现top命令显示的是你的程序占用的cpu的总数&am…

FileUpload时用Javascript检查扩展名是否有效

通用的检查方法。首先定义好有效的文件扩展名&#xff0c;存放在阵列中。 在JavaScript获取FileUpload控件的文件路径&#xff0c;并取得路径中的文件扩展名。再与阵列中的扩展名比较&#xff0c;如果存在&#xff0c;说明上传的文件是有效的&#xff0c;反之无效。 <asp:Fi…

python dialect='excel'是什么意思_python读取和生成excel文件

今天来看一下如何使用python处理excel文件&#xff0c;处理excel文件是在工作中经常用到的&#xff0c;python为我们考虑到了这一点&#xff0c;python中本身就自带csv模块... 今天来看一下如何使用python处理excel文件&#xff0c;处理excel文件是在工作中经常用到的&#xff…

玩转博客园的5个小技巧

转载自:http://www.cnblogs.com/lloydsheng/archive/2010/05/17/1737267.html 写博客也有几年了&#xff0c;现在能找到的第一篇博文发布时间是2007年11月11日&#xff0c;那还是在百度空间里面的&#xff0c;其实更早的是在csai&#xff0c;不过帐号&#xff0c;密码&#xff…

linux kvm安装win7,ubuntu14.04 使用kvm安装win7系统

办公电脑从win7换成ubuntu已经有几个月了..环境:ubuntu 14.04kvm 2.0.0需要的各种软件也都安装的差不多了.. 迅雷 qq office vmware 等 这些我常用的软件也都安装上了..我的电脑配置也算可以了(thinkpad E 系列 i5 8G内存 )但是vmware这个东西在ubuntu上的表现不是那么让人满意…

hibernate继承映射之每个具体类一张表

数据模型 表person 表student 表worker 对象模型 Person private String id;private String name;private int age;private String sex; Student extends Person private String school; Worker extends Person private String factory; xml配置&#xff1a; <?xml version…

No resource found that matches the given name 'android:Widget.Material.A解决方案

1&#xff1a;首先新建空白工作区 2&#xff1a;先import appcompat_v7 appcompat_v7在一个类似这样的地方&#xff0c; C:\mywork\android\android-sdk-windows\extras\android\support\v7\appcompat 然后用import进来&#xff0c;像如下操作&#xff1a; 确保sdk是5.0及以上 …

python easygui进度条_Python _easygui详细版

1. msgbox msgbox(msg(Your message goes here), title , ok_buttonOK, imageNone, rootNone) msgbox() 显示一个消息和提供一个"OK"按钮&#xff0c;你可以指定任意的消息和标题&#xff0c;你甚至可以重写"OK"按钮的内容。 import easygui as g g.msgbox…

swappiness

2019独角兽企业重金招聘Python工程师标准>>> swappiness参数位于&#xff1a;/etc/sysctl.cof swappiness0表示最大限度使用物理内存&#xff0c;然后才是swap空间。swappiness100的时候表示积极的使用swap分区&#xff0c;并把内存上的数据及时地搬运到swap空间…

宏基笔记本4740 Linux,宏基4740g拆机【教程详解】

笔记本电脑 使用久了内部会累积有灰尘&#xff0c;这些灰尘可能会影响到正常的使用;还有些人觉得笔记本电脑内存不够&#xff0c;想要加装个内存条;亦或想要帮助笔记本电脑换cpu等&#xff0c;这些都是需要将笔记本电脑拆卸下来&#xff0c;然后才能够完成好相关的工作。宏基47…

如何正确创建DLL和使用DLL

如何正确创建DLL和使用DLL 本文将通过一个简单的实例来说明&#xff0c;如何正确的导出DLL中的类、对象、函数&#xff0c;并如何通过静态加载或动态加载的方式来使用DLL。 一、DLL中导出类、函数、对象 1. 创建一个空的Win32 Dynamic-Link Library项目Test 2. 在项目中添加一个…

mysql-5.7.11-winx64.zip 安装配置

1、下载 http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.11-winx64.zip 2.解压缩zip包&#xff1b; D:\Program Files\mysql-5.7.11-winx64 3.配置环境变量&#xff0c; 3.1 添加path路径&#xff0c; D:\Program Files\mysql-5.7.11-winx64\bin 3.2.修改mysql-default.…

【分享】LazyLoad延迟加载(按需加载)

1&#xff1a;实际需求 大型网站往往很矛盾&#xff0c;想用户在首页看到更多东西&#xff0c;又不想浪费太多服务器流量。比如一个有3屏的首页。可能50%的用户进首页的目的是点击首页的连接&#xff0c;到子页面。 那么我们的网站却为100%的用户加载了 3个 屏幕的所有内容。如…

python中ipo模型有_python ipo模型是指什么?_后端开发

c语言中如何用do...while语句求1到100的累加和_后端开发 c语言中用do...while语句求1到100的累加和的方法是&#xff1a;1、首先定义变量i与sum&#xff0c;如【int sum0,i1】&#xff1b;2、然后用do...while语句实现即可&#xff0c;如【do{sumsumi;i;}while(i<100)】。py…

英语26个字母使用频度

LetterLetter namePronunciation NLetterFrequency LetterFrequencyAa/ˈeɪ/, //[nb 2] 1A8.17% E12.70%Bbee/ˈbiː/ 2B1.49% T9.06%Ccee/ˈsiː/ 3C2.78% A8.17%Ddee/ˈdiː/ 4D4.25% O7.51%Ee/ˈiː/ 5E12.70% I6.97%Fef (eff as a verb)/ˈɛf/ 6F2.23% N6.75%Ggee/ˈdʒi…

java签到_实战:如果让你用SpringBoot实现签到奖励的功能,你会怎么做?

阅读本文大概需要 6 分钟。来自&#xff1a;网络前言最近在做社交业务&#xff0c;用户进入APP后有签到功能&#xff0c;签到成功后获取相应的奖励&#xff1a;项目状况&#xff1a;前期尝试业务阶段&#xff1b;特点&#xff1a;快速实现&#xff08;不需要做太重&#xff0c;…

软件开发工具介绍之 1.代码生成器

在程序开发过程当中&#xff0c;程序员会经常做着重复性的工作&#xff0c;最常见的是访问数据库&#xff0c;程序员要经常编写增、删、改、分页之类的操作。为了避免这个问题&#xff0c;节省大量机械录入的时间和重复劳动&#xff0c;提高工作效率&#xff0c;而将精力集中于…

python自带的shell、其性能优于ipython吗_Python自带的shell,其性能优于IPython

信源X的&#xff0c;自带每一机事件的都相等个随概率&#xff0c;即P。 优于 自带优于 自带求(机械的保养要。 优于标有机械的主管理要指。 下尺性期人手节分的病离急法整复后&#xff0c;自带项处做哪理&#xff1a;还应。 并放下肢射至&#xff0c;优于现右肢放扭伤右下臀及后…

虚拟机测试必备虚拟机之VirtualBox 使用

2019独角兽企业重金招聘Python工程师标准>>> 安装&#xff0c;windowns在官网上对应版本下载下一步安装结束即可&#xff0c;配置有seting可以选择中文&#xff0c;方便理解&#xff0c;其实英文也好功能 不多。 安装linux&#xff1a;ubuntu&#xff0c;如果有网su…