ios动画笔记(2)CATransform3D和CASpringAnimation 、CATransition和CAEmitterLayer、UIDynamicAnimator

用到了,经常忘记,记录一下几个例子


1、CATransform3D


主要能产生z轴翻转时的效果?记录下几个函数调用

(1)、CATransform3DIdentity 返回动画最初的状态,该矩阵没有缩放,旋转,歪斜,透视。该矩阵应用到图层上,就是设置默认值。

(2)、CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);//旋转

旋转效果。angle:旋转的弧度,所以要把角度转换成弧度:角度 * M_PI / 180。x:向X轴方向旋转。值范围-1 --- 1之间y:向Y轴方向旋转。值范围-1 --- 1之间z:向Z轴方向旋转。值范围-1 --- 1之间


(3)、CATransform3D CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz)//位置移动

tx::x平移。  ty:y平移。  tz:z平移,tx:X轴偏移位置,往下为正数。ty:Y轴偏移位置,往右为正数。tz:Z轴偏移位置,往外为正数。

(4)、CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);

sx:X轴缩放,代表一个缩放比例,一般都是 0 --- 1 之间的数字。sy:Y轴缩放。sz:整体比例变换时,也就是m11(sx)== m22(sy)时,若m33(sz)>1,图形整体缩小,若0<1,图形整体放大,若m33(sz)<0,发生关于原点的对称等比变换。


(5)、CATransform3DConcat(rotateTransform, scaleTransform); //Concat就是combine的意思

+(void)animal3D8:(UIView *)view1 view2:(UIView *)view2
{
    view1.layer.transform = CATransform3DMakeRotation(M_PI/4, 0, 1, 0);
    
    CATransform3D trans = CATransform3DIdentity;
    trans.m34 = -1/100.0;
    trans = CATransform3DRotate(trans, M_PI * 3 , 0, 1, 0);
//    view2.layer.transform =trans;
    
    CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
    [theAnimation setAutoreverses:YES];  //原路返回的动画一遍
    [theAnimation setDuration:2.0];
    [theAnimation setRepeatCount:HUGE_VALF];
    [theAnimation setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]]; //放在3D坐标系中最正的位置
    [theAnimation setToValue:[NSValue valueWithCATransform3D:trans]];
    [view2.layer addAnimation:theAnimation forKey:nil];
    
}




2、CATransition


+ (void)basceAnimal9:(UIImageView *)centerShow
{
    CATransition * ani = [CATransition animation];
    ani.type = kCATransitionFade;
    ani.subtype = kCATransitionFromLeft;
    ani.duration = 1.5;
    
    if ([centerShow.image isEqual:[UIImage imageNamed:@"flower"]])
    {
        centerShow.image = [UIImage imageNamed:@"reUpload"];
    }
    else
    {
        centerShow.image = [UIImage imageNamed:@"flower"];
    }
    [centerShow.layer addAnimation:ani forKey:@"transitionAni"];
}



3、CASpringAnimation


弹簧效果

+ (void)basceAnimal10:(UIView *)centerShow
{
    CASpringAnimation * ani = [CASpringAnimation animationWithKeyPath:@"bounds"];
    ani.mass = 10.0; //质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大
    ani.stiffness = 5000; //刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快
    ani.damping = 100.0;//阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快
    ani.initialVelocity = 5.f;//初始速率,动画视图的初始速度大小;速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反
    ani.duration = ani.settlingDuration;
    ani.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, centerShow.frame.size.width + 200, centerShow.frame.size.height + 200)];
    
    ani.removedOnCompletion = NO;
    ani.fillMode = kCAFillModeForwards;
    ani.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [centerShow.layer addAnimation:ani forKey:@"boundsAni"];
}


4.CAEmitterLayer

粒子发射

-(CAEmitterLayer *)emitter
{
    if (!_emitter)
    {
        _emitter = [CAEmitterLayer layer];
        //给定尺寸
//        _emitter.frame = CGRectMake(100, 100, 100, 100);
//        //显示边框
//        _emitter.borderWidth = 0.f;
        //发射点
        _emitter.emitterPosition = CGPointMake(-20, mScreenHeight - 400);
        //发射模式
        _emitter.emitterMode = kCAEmitterLayerSurface;
        //发射形状
        _emitter.emitterShape = kCAEmitterLayerLine;
        
        [self.view.layer addSublayer:_emitter];
        
        CAEmitterCell *cell = [CAEmitterCell emitterCell];
        //粒子产生率
        cell.birthRate = 30.f;
        //粒子生命周期
        cell.lifetime = 1.f;
        cell.lifetimeRange=1;
//        cell.speed = 5.f;
        //速度值
//        cell.velocity = 10;
        //速度值的微调值
//        cell.velocityRange = 20;
        //y轴加速度
//        cell.yAcceleration = -500.f;
        
        cell.scale = 0.5;
        cell.scaleRange = 0.5;
//        cell.xAcceleration = 2.f;
        //发射角度
        cell.emissionRange = 0.5 * M_PI;
        //设置粒子颜色
        //    cell.color = [UIColor blueColor].CGColor;
        
        cell.contents = (__bridge id _Nullable)([UIImage imageNamed:@"snow"].CGImage);
        
        //粒子的速度
        cell.velocity = 80;
        //粒子速度的容差
        cell.velocityRange=45;
        cell.emissionLatitude = -M_PI_2;
//        cell.emissionLongitude = -M_PI_2*0.5;
        cell.emissionRange = 0.5  * M_PI_2;
        //让CAEmitterCell与CAEmitterLayer产生关系
        _emitter.emitterCells = @[cell];
    }
    return _emitter;
}


static int i = 0;

-(void)emitterSnow
{
    i = i + 5;
    if (i > mScreenWidth)
    {
        i = -20;
//        [self.snowTimer invalidate];
//        self.snowTimer = nil;
    }
    NSLog(@"--->>%d",i);
    self.emitter.emitterPosition = CGPointMake(i, mScreenHeight - 400);
}


5、UIDynamicAnimator

重力、碰撞属性等

-(void)initSelfData
{
//    attachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:bgView1
//                                                   offsetFromCenter:self.view.center
//                                                   attachedToAnchor:location];
    
//    animator= [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//    [animator addBehavior:self.attachmentBehavior];
    
    UIDynamicAnimator* animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
    
    UICollisionBehavior* collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[bgView1]];
//    UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc]init];
    //碰撞类型为元素和边界
    collisionBehavior.collisionMode = UICollisionBehaviorModeEverything;
//    CGFloat Y = self.view.frame.size.height - 40;
//    CGFloat X = self.view.frame.size.width;
//    CGFloat height = self.view.frame.size.height;
    
    //设置红色的View为底边界,左边框跟右边框作为边界
//    [collisionBehavior addBoundaryWithIdentifier:@"collision1" fromPoint:CGPointMake(0,Y) toPoint:CGPointMake(X, Y)];
//    [collisionBehavior addBoundaryWithIdentifier:@"collision2" fromPoint:CGPointMake(0, 0) toPoint:CGPointMake(0, height)];
//    [collisionBehavior addBoundaryWithIdentifier:@"collision3" fromPoint:CGPointMake(X,0) toPoint:CGPointMake(X, height)];

//    [collisionBehavior addItem:bgView1];
    [collisionBehavior addItem:bgView2];
    collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
    [animator addBehavior:collisionBehavior];
    
    UIGravityBehavior *g = [[UIGravityBehavior alloc] initWithItems:@[bgView1]];
    [animator addBehavior:g];
    
    self.animator = animator;
    
//    [self animal1];
    
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值