iOS CAAnimation核心动画

深入探索iOS动画:《iOS核心动画高级技术》源代码分析 在iOS开发中,核心动画技术是实现流畅且富有吸引力用户界面不可或缺的一环。它不仅负责在屏幕上平滑渲染视觉效果,而且还能响应用户交互,创建令人愉悦的动态体验。无论是在游戏、社交媒体应用还是企业软件中,掌握核心动画技术是区分一个应用是否专业与吸引人的关键点。理解并掌握这一技术,将赋予开发者更多创造的可能性和更强的竞争力。CALayer的视觉属性定义了图层的外观和状态。这些属性的设置决定了图层的显示效果。Frame和Bounds。 阅读详情

前言

Core Animation核心动画主要是采用CAAnimation抽象超级类的子类实现动画,它是一组非常强大的动画处理API.使用它能做出非常绚丽的动画效果.Core Animation可以用在Mac OS X和iOS平台. Core Animation的动画执行过程是在后台操作的.不会阻塞主线程.要注意的是, Core Animation是直接作用在CALayer上的.并非UIView.(Core Animation的Demo)

一、CAAnimation详细介绍

Core Animation核心动画主要是采用CAAnimation抽象超级类的子类实现动画

1.CAAnimation是什么?

CAAnimation:The abstract superclass for animations in Core Animation.苹果文档。它的父类是NSObject,遵守NSSecureCoding, NSCopying, CAMediaTiming, CAAction协议的Core Animation动画抽象超类。

2.CAAnimation拥有哪些方法和属性

方法:
 
 + (instancetype)animation;          // 创建实例对象
 // 设置动画key值(在CALayer添加动画时,添加动画并设置key:CALayer方法中设置- (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key;)
 + (nullable id)defaultValueForKey:(NSString *)key;   //
 - (BOOL)shouldArchiveValueForKey:(NSString *)key;

属性类别:
 
 // 设置 动画一段时的快慢
 //设置了其动画的时间函数为CAMediaTimingFunction(name:kCAMediaTimingFunctionLinear)。时间函数通过修改持续时间的分数来控制动画的速度。(猜想:通过这个方法设置CAMediaTiming协议下的speed)
 
// kCAMediaTimingFunctionLinear  //线型移动
// kCAMediaTimingFunctionEaseIn  //淡入
// kCAMediaTimingFunctionEaseOut   //淡出
// kCAMediaTimingFunctionEaseInEaseOut   //淡入淡出
// kCAMediaTimingFunctionDefault       // 默认
// 同时可以通过自定义CAMediaTimingFunction时间功能定义动画的时间
 
 @property(nullable, strong) CAMediaTimingFunction *timingFunction;
 
 // 动画的执行的两个阶段的代理
 @property(nullable, strong) id <CAAnimationDelegate> delegate;
 
 // 是否 移除动画执行完渲染树,
 //默认情况下是YES,动画执行完CALayer恢复最初状态为:NO,保留原始CALayer渲染树。
 //注意:在使用fillMode动画时,不能使用YES(执行完成后,动画内容消失)
 
 @property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;

3.CAAnimation遵守的协议

NSSecureCoding, NSCopying对应的内容无需要多解释,在iOS经常会看到两个协议。

  • CAAction: 协议方法:

//被调用以在接收器上触发名为“path”的事件。
// 事件发生的对象(例如图层)是“anObject”。 参数字典可以是nil,如果是非nil,它携带与事件相关的参数
- (void)runActionForKey:(NSString *)event object:(id)anObject
arguments:(nullable NSDictionary *)dict;

  • CAMediaTiming:CAMediaTiming协议实现 layers动画,CAMediaTiming
    CAMediaTiming协议通过设置开始时间、动画执行时间、次数以及speed、timeoffset的方式控制动画
 
 //设置当前动画开始的时间,如果没有设置默认为0,动画当前生成的时间
 @property CFTimeInterval beginTime;
 // 设置 动画执行的时长 默认:0
 @property CFTimeInterval duration;
 
 // 可以通过这两个参数设置更复杂的动画效果,可以实现动画的暂停、快进等效果
 //动画执行时间: t = (tp - begin) * speed + offset
 // 动画执行时间为:t     系统时间:tp   动画开始时间:begin
 // 默认情况下,speed:1     offset:0
 // speed:单位时间执行的rate  例子:如果rate是2  本地时间是当前时间快两倍
 @property float speed;
 @property CFTimeInterval timeOffset;
 
 
 //执行的重复次数
 @property float repeatCount;
 
 //每次执行的时长   默认时间为0
 @property CFTimeInterval repeatDuration;
 
 // 是否 动画逆转执行;自定义为NO
 @property BOOL autoreverses;
 
 
 //默认是kCAFillModeRemoved,当动画不再播放的时候就显示图层模型指定的值剩下的三种类型向前,向后或者即向前又向后去填充动画状态,使得动画在开始前或者结束后仍然保持开始和结束那一刻的值。其中一下四种类型:
 //kCAFillModeForwards
 //kCAFillModeBackwards
// kCAFillModeBoth
// kCAFillModeRemoved
 
 @property(copy) CAMediaTimingFillMode fillMode;

4.CAAnimation动画的继承关系

在Core Animation中可以使用创建实例对象的动画类:

1.基础动画: CABasicAnimation
2.关键帧动画: CAKeyframeAnimation
3.转场动画: CATransition
4.弹性动画: CASpringAnimation
5.动画组合: CAAnimationGroup
这几个动画类的层级关系如下图:

CAAnimation{
    CAPropertyAnimation {
        CABasicAnimation {
           CASpringAnimation
        }
        CAKeyframeAnimation
    }
    CATransition
    CAAnimationGroup
 }

总结:单位时间内一个物体改变量(距离、颜色、形状等)形成动画。而CAAnimation类是对动画时间相关的内容的处理,相关的量值并没有定义,CAAnimation并不能构成一个动画的完整条件,只能让其子类来实现完整的动画。

二、Core Animtion其他类介绍

1.CAPropertyAnimation

CAPropertyAnimation:继承CAAnimation,其子类:CABasicAnimation和CAKeyframeAnimatio
创建CAPropertyAnimation需要设置『动画对象』的关键keyPath(每个对象的属性都是一个keypath值)

 //CAAnimation的抽象子类,用于创建操纵图层属性值的动画。CABasicAnimation和CAKeyframeAnimation其子类
 + (instancetype)animationWithKeyPath:(nullable NSString *)path;
 
 //用于设置动画对象key-path值
 @property(nullable, copy) NSString *keyPath;
 
 //这两个值是只读属性的值,不需要关心
 @property(getter=isAdditive) BOOL additive;
 @property(getter=isCumulative) BOOL cumulative;
 
 //如果非nil是在将插值设置为动画的目标属性的新显示值之前应用于插值的函数。 默认为零。
 @property(nullable, strong) CAValueFunction *valueFunction;
2.CABasicAnimation

CABasicAnimation : 继承CAPropertyAnimation

//
//这三个属性之间的规则
//
//fromValue和toValue不为空,动画的效果会从fromValue的值变化到toValue.
//fromValue和byValue都不为空,动画的效果将会从fromValue变化到fromValue+byValue
//toValue和byValue都不为空,动画的效果将会从toValue-byValue变化到toValue
//只有fromValue的值不为空,动画的效果将会从fromValue的值变化到当前的状态.
//只有toValue的值不为空,动画的效果将会从当前状态的值变化到toValue的值.
//只有byValue的值不为空,动画的效果将会从当前的值变化到(当前状态的值+byValue)的值.
//

@property(nullable, strong) id fromValue;
@property(nullable, strong) id toValue;
@property(nullable, strong) id byValue;

例子:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    
    NSArray *btnArrTitle = @[@"平移动画",@"缩放动画",@"旋转动画",@"颜色动画"];
    NSInteger lineNum = 2;
    CGFloat BtnWith = 150;
    CGFloat btnHeight = 30;
    
    CGFloat oneWith = BtnWith + 30;
    CGFloat oneHeigth = btnHeight + 30;
    
    for (int i = 0; i< btnArrTitle.count; i++) {
        NSInteger currentLineNum = i / lineNum;
        NSInteger currentEveryNum = i % lineNum;
        UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20 + oneWith * currentEveryNum, 100 + currentLineNum * oneHeigth, BtnWith, btnHeight)];
        [btn setTitle:btnArrTitle[i] forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        
        [btn addTarget:self action:@selector(animationBtnAction:) forControlEvents:UIControlEventTouchUpInside];
        btn.tag = i + 10;
        btn.backgroundColor = [UIColor greenColor];
        btn.layer.cornerRadius = 5;
        btn.layer.masksToBounds = true;
        [self.view addSubview:btn];
    }
    
    _animationView = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 50, 50)];
    _animationView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_animationView];
    
    
}

-(void)animationBtnAction:(UIButton *)send{
    NSInteger num = send.tag - 10;
    CABasicAnimation *animationBasic = [[CABasicAnimation alloc] init];
    
    switch (num) {
          //动画平移
        case 0:
            animationBasic.keyPath = @"position";
            animationBasic.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.center.x, self.view.center.y+100)];
            break;
            // 缩放
        case 1:
            animationBasic.keyPath = @"transform.scale";
            animationBasic.fromValue = @1;
            animationBasic.toValue = @0.1;
            break;
            
//            旋转动画
        case 2:
            animationBasic.keyPath = @"transform.rotation";
            animationBasic.toValue = @(M_PI);
            break;
            
//            颜色
        case 3:
            animationBasic.keyPath = @"opacity";
            animationBasic.fromValue = @1;
            animationBasic.toValue = @0.1;
            break;
            
        default:
            break;
    }
    animationBasic.duration = 1;
    
    animationBasic.removedOnCompletion = false;
    
    animationBasic.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    
    //反转
//    [animationBasic setAutoreverses:true];
    
    [self.animationView.layer addAnimation:animationBasic forKey:@"basic"];
}

4.CAKeyframeAnimation

CAKeyframeAnimation:继承CAPropertyAnimation

// values  为动画提供一个关键帧的关键值得关键点
@property(nullable, copy) NSArray *values;
// 提供一个动画执行的路径,默认为nil,如果不为空,设置为kCAAnimationPaced
@property(nullable) CGPathRef path;

// 关键帧之间动画的时间节点,rang为[0,1]
@property(nullable, copy) NSArray<NSNumber *> *keyTimes;

// 设置关键帧之间的动画快慢效果
@property(nullable, copy) NSArray<CAMediaTimingFunction *> *timingFunctions;

// The "calculation mode". Possible values are `discrete', `linear',
//`paced', `cubic' and `cubicPaced'. Defaults to `linear'. When set to
//  `paced' or `cubicPaced' the `keyTimes' and `timingFunctions'
//properties of the animation are ignored and calculated implicitly.

@property(copy) CAAnimationCalculationMode calculationMode;


// 对于具有三次计算模式的动画,这些属性提供对插值方案的控制。 每个关键帧可能具有与之关联的张力,连续性和偏差值,每个都在[-1,1]范围内(这定义了Kochanek-Bartels样条,请参阅http://en.wikipedia.org/wiki/Kochanek-Bartels_spline)。 
// 张力值控制曲线的“紧密度”(正值更紧,负值更圆)。 连续性值控制段的连接方式(正值给出尖角,负值给出倒角)。 偏差值定义曲线发生的位置(正值在控制点之前移动曲线,负值在控制点之后移动它)。 
//每个数组中的第一个值定义第一个控制点的切线的行为,第二个值控制第二个点的切线,依此类推。 任何未指定的值都默认为零(如果未指定所有值,则给出Catmull-Rom样条曲线)。

@property(nullable, copy) NSArray<NSNumber *> *tensionValues;
@property(nullable, copy) NSArray<NSNumber *> *continuityValues;
@property(nullable, copy) NSArray<NSNumber *> *biasValues;
 
//如果关键帧执行过程中自动相反旋转
@property(nullable, copy) CAAnimationRotationMode rotationMode;

例子:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *btnArrTitle = @[@"平移动画",@"缩放动画",@"旋转动画",@"颜色动画",@"BezierPath"];
    NSInteger lineNum = 2;
    CGFloat BtnWith = 150;
    CGFloat btnHeight = 30;
    
    CGFloat oneWith = BtnWith + 30;
    CGFloat oneHeigth = btnHeight + 30;
    
    for (int i = 0; i< btnArrTitle.count; i++) {
        NSInteger currentLineNum = i / lineNum;
        NSInteger currentEveryNum = i % lineNum;
        UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20 + oneWith * currentEveryNum, 100 + currentLineNum * oneHeigth, BtnWith, btnHeight)];
        [btn setTitle:btnArrTitle[i] forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        
        [btn addTarget:self action:@selector(animationBtnAction:) forControlEvents:UIControlEventTouchUpInside];
        btn.tag = i + 10;
        btn.backgroundColor = [UIColor greenColor];
        btn.layer.cornerRadius = 5;
        btn.layer.masksToBounds = true;
        [self.view addSubview:btn];
    }
    
    _animationLayer = [[CALayer alloc] init];
    _animationLayer.frame = CGRectMake(100, 300, 50, 50);
    _animationLayer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:_animationLayer];
}


-(void)animationBtnAction:(UIButton *)send{
    NSInteger num = send.tag - 10;
    CAKeyframeAnimation *keyAnimation = [[CAKeyframeAnimation alloc] init];
     UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(125, 325, 200, 300)];
    
    
//      使用PathRef
//    CGMutablePathRef path = CGPathCreateMutable();//创建可变路径
//    CGPathAddEllipseInRect(path, NULL, CGRectMake(0, 0, 320, 500));
//    CGPathRelease(path);

    switch (num) {
            //动画平移
        case 0:
            keyAnimation.keyPath = @"position";
            keyAnimation.values = @[[NSValue valueWithCGPoint:CGPointMake(self.animationLayer.frame.origin.x, self.animationLayer.frame.origin.y)],[NSValue valueWithCGPoint:CGPointMake(self.animationLayer.frame.origin.x, self.animationLayer.frame.origin.y+100)],[NSValue valueWithCGPoint:CGPointMake(self.animationLayer.frame.origin.x+100, self.animationLayer.frame.origin.y+100)],[NSValue valueWithCGPoint:CGPointMake(self.animationLayer.frame.origin.x + 100, self.animationLayer.frame.origin.y)],[NSValue valueWithCGPoint:CGPointMake(self.animationLayer.frame.origin.x, self.animationLayer.frame.origin.y)]];
            break;
            // 缩放
        case 1:
            keyAnimation.keyPath = @"transform.scale";
            keyAnimation.values = @[@1,@0.2,@0.9,@0.1];
            break;
            
            //            旋转动画
        case 2:
            keyAnimation.keyPath = @"transform.rotation";
            keyAnimation.values = @[@(M_2_PI),@(-M_PI),@(M_PI * 2),@(0)];
            break;
            
            //            颜色
        case 3:
            keyAnimation.keyPath = @"opacity";
            keyAnimation.values = @[@1,@0.2,@0.9,@0.1];
            break;
            
        case 4:
            keyAnimation.keyPath = @"position";
            keyAnimation.path = bezierPath.CGPath;
            break;
        default:
            break;
    }
    keyAnimation.duration = 5;
    
    keyAnimation.removedOnCompletion = false;
    keyAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    
    //反转
    //    [animationBasic setAutoreverses:true];
    
    [self.animationLayer addAnimation:keyAnimation forKey:@"basic"];
}

5.CASpringAnimation

CASpringAnimation:继承CABasicAnimation (iOS 9)

//理解下面的属性的时候可以结合现实物理现象,比如把它想象成一个弹簧上挂着一个金属小球
 //质量,振幅和质量成反比
 @property CGFloat mass;
 //刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快
 @property CGFloat stiffness;
 //阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快,可以认为它是阻力系数
 @property CGFloat damping;
 //初始速率,动画视图的初始速度大小速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反.
 @property CGFloat initialVelocity;
 //结算时间,只读.返回弹簧动画到停止时的估算时间,根据当前的动画参数估算通常弹簧动画的时间使用结算时间比较准确
 @property(readonly) CFTimeInterval settlingDuration;

例子:

-(void)animationBegin:(id)sender
{
    UIButton *btn = (UIButton *)sender;
    
    CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"position.y"];
    springAnimation.mass = 1;
    springAnimation.stiffness = 100;
    springAnimation.damping = 1;
    springAnimation.initialVelocity = 0;
    springAnimation.duration = springAnimation.settlingDuration;
    springAnimation.fromValue = @(self.opView.center.y);
    springAnimation.toValue = @(self.opView.center.y + (btn.selected?+150:-150));
    springAnimation.fillMode = kCAFillModeForwards;
    [self.opView.layer addAnimation:springAnimation forKey:nil];
    
    btn.selected = !btn.selected;
}

6.CATransition

CATransition:继承 CAAnimation

 //转场类型,字符串类型参数.系统提供了四中动画形式:
 //kCATransitionFade//逐渐消失
 //kCATransitionMoveIn//移进来
 //kCATransitionPush//推进来
 //kCATransitionReveal//揭开
 //另外,除了系统给的这几种动画效果,我们还可以使用系统私有的动画效果:
 //@"cube",//立方体翻转效果
 //@"oglFlip",//翻转效果
 //@"suckEffect",//收缩效果,动画方向不可控
 //@"rippleEffect",//水滴波纹效果,动画方向不可控
 //@"pageCurl",//向上翻页效果
 //@"pageUnCurl",//向下翻页效果
 //@"cameralIrisHollowOpen",//摄像头打开效果,动画方向不可控
 //@"cameraIrisHollowClose",//摄像头关闭效果,动画方向不可控
 @property(copy) NSString *type;
 //转场方向,系统一共提供四个方向:
 //kCATransitionFromRight//从右开始
 //kCATransitionFromLeft//从左开始
 //kCATransitionFromTop//从上开始
 //kCATransitionFromBottom//从下开始
 @property(nullable, copy) NSString *subtype;
 
 //开始进度,默认0.0.如果设置0.3,那么动画将从动画的0.3的部分开始
 @property float startProgress;
 //结束进度,默认1.0.如果设置0.6,那么动画将从动画的0.6部分以后就会结束
 @property float endProgress;
 
 
 CATransition也是继承CAAnimation,系统默认提供了12种动画样式,加上4个动画方向,除了方向不可控的四种效果外,大概一共提供了36种动画.
 

例子:

-(void)btnTransitionAnimation{
    CATransition *transitionAnimation = [[CATransition alloc] init];
    transitionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    transitionAnimation.duration = 1;
    transitionAnimation.removedOnCompletion = true;
    
    transitionAnimation.type = @"cube";
    transitionAnimation.subtype = kCATransitionFromLeft;
    
    [_transitionView.layer addAnimation:transitionAnimation forKey:@"transition"];
  }
7.CAAnimationGroup

CAAnimationGroup继承于CAAnimation

//CAAnimationGroup动画组
/只有一个属性,数组中接受CAAnimation元素
@property(nullable, copy) NSArray *animations;

例子:

-(void)btnAcitonAnimation{
    
    CAAnimationGroup *animationGroup = [[CAAnimationGroup alloc] init];
    CAKeyframeAnimation *keyAnimation = [self addKeyFrame];
    CABasicAnimation *scaleAnimation =[self addBasicFrame];
    CABasicAnimation *rotationAnimation = [self addBasicOtherFrame];
    
    animationGroup.duration = 4;
    animationGroup.animations = @[scaleAnimation,keyAnimation,rotationAnimation];
    [_animationGroupLayer addAnimation:animationGroup forKey:@"group"];
    
}


-(CAKeyframeAnimation *)addKeyFrame{
    CAKeyframeAnimation *keyAnimation = [[CAKeyframeAnimation alloc] init];
    keyAnimation.keyPath = @"position";
    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(125, 325, 200, 300)];
    keyAnimation.path = bezierPath.CGPath;
    
    keyAnimation.removedOnCompletion = false;
    keyAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    keyAnimation.autoreverses = false;
    keyAnimation.duration = 4;
    
    return keyAnimation;
}

-(CABasicAnimation *)addBasicFrame{
    CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    basicAnimation.fromValue = @1;
    basicAnimation.toValue = @0.1;
    basicAnimation.removedOnCompletion = false;
    basicAnimation.duration = 4;
    basicAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    basicAnimation.autoreverses = true;
    
    return basicAnimation;
}

-(CABasicAnimation *)addBasicOtherFrame{
    CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    basicAnimation.fromValue = @(0);
    basicAnimation.toValue = @(2*M_PI);
    basicAnimation.removedOnCompletion = false;
    basicAnimation.duration = 4;
    basicAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    basicAnimation.autoreverses = true;
    
    return basicAnimation;
}

总之

Core Animation动画其实就是通过设置CAAnimation中的协议和CAAnimation子类的属性实现动画效果,迅速创建一个动画需要注意的事项:

  • 1.需要必须设置的属性:时间(duration)、需要改变的属性key-path(位置、角度、颜色深浅等),key-path改变的值。
  • 2.其他属性的设置,根据需要设置
CAAnimation 这个demo主要实现了,单个动画的移动,缩放,翻转,以及将这些动画组合起来的效果 立即下载

相关推荐

2. Netty使用JSerialComm进行串口读取(二)

现在开始处理这些问题 第一个问题:串口读取超时异常一路传播到最后也没有处理。 ​ 第二个问题:即使处理了该异常,程序仍然退出,这不能满足一些实际使用要求需求。该问题与设置很长的读取超时时间没关系,无论多长到时间后总会退出。

s3c2410的博客 2462

iOS CAAnimation使用详解

理解了隐式动画后,显式动画就更加通俗易懂了。区别于隐式动画的特点,显式动画就是需要我们明确指定类型、时间等参数来实现效果的动画。除此之外,我们也可以创建非线性动画,比如沿着任意一条曲线运动等; 我们平时最常用的也是显式动画,不仅系统为我们的视图提供了UIViewAnimationWithBlock的动画封装,而且我们在熟悉了Core Animation的动画属性后也可以很方便的设置显式动画; 一、动画的分类 1、实现动画的方式 如果根据实现动画时直接操作对象的类型,我们可以简单的将动画分为视图和图层两种;但

假装你是大灰狼的专栏 1486

手把手教你用C语言给STM32写一个Modbus RTU从机库(含完整项目源码)

在工业自动化领域,Modbus RTU协议因其简单可靠的特点,成为RS485总线通信的事实标准。对于嵌入式开发者而言,为STM32等微控制器实现一个高效的Modbus RTU从机协议栈,是开发智能传感器、执行器等设备的必备技能。Modbus RTU从机的核心是一个状态机,需要处理帧接收、CRC校验、功能码解析和响应生成等环节。工业现场总会遇到意想不到的干扰情况,一个健壮的协议栈应该能够优雅地处理各种异常场景,而不是简单地崩溃或死锁。工业现场环境复杂,协议栈必须具备完善的异常处理机制。

weixin_30561425的博客 516

iOS - CAAnimation动画集合

QuartzCore框架下CAAnimation以及UIViewAnimation的动画集合:移动、旋转、缩放、弹簧、组合动画以及各种转场效果、漂移动画和常见动画示例。

chaneylauok的博客 461

Mac 环境配置jdk、Maven

3、终端打开配置jdk时候建好的脚本文件: open -e .bash_profile。4、查看maven是否安装成功和系统能不能识别maven/mvn命令:⬇️。输入⬇️并保存: 其中第一行JAVA_HOME替换为自己下的jdk路径。,安装编译好的二进制版本,具体安装zip还是tar.gz我看的。5、查看jdk是否安装成功和系统能不能识别java命令:⬇️。至此,我的Mac系统的环境配置jdk、Maven完成!然后就发现我的maven命令还是没作用,不识别,下载后直接安装即可,很快,点几下就OK了。

weixin_42416791的博客 4403

海康VisionMaster零代码开发实战:从PLC工程师到视觉专家的捷径

本文为PLC工程师提供了利用海康VisionMaster视觉平台实现零代码视觉开发的实战指南。文章详细阐述了如何通过图形化流程设计替代传统编程,快速搭建视觉检测应用,并实现与PLC的无缝通讯,是工程师从设备控制迈向视觉系统集成的有效捷径。

weixin_29201859的博客 293

iOS核心动画(一)CAAnimation

Core Animation中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。Core Animation是跨平台的,可以用在Mac OS X和iOS平台。Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。不阻塞主线程,可以理解为在执行动画的时候还能点击(按钮)。要注意

圆缘园猿的博客 845

openmediavault(OMV)(30)插件介绍(3)filebrowser文件管理器

filebrowser可以对omv的文件进行图形化管理,而不需要每次都通过命令进行修改。filebrowser安装。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2320

[CAAnimation核心动画练习一]普通的平移,旋转,缩放

[CAAnimation核心动画练习一]普通的平移,旋转,缩放

灵眼儿上方 2914

windows server 2012安装升级MySQL

本篇文章主要介绍的是windows server 2012 R2操作系统安装升级以及过程中遇到的问题和对应的解决方法。(数据库低版本为:mysql-5.7.27-winx64;数据库数据库高版本为:mysql-5.7.44-winx64;提示:以下是本篇文章正文内容,下面案例可供参考。

qq_42776231的博客 780

Transformer从菜鸟到新手(一)

从本文开始回顾一下Transformer的原理与实现细节,包括分词算法BPE的实现。最终利用从零实现的Transformer模型进行英中翻译。

日积月累,天道酬勤 2125

iOS 动画篇 - CAAnimation初识

CAAnimation 是一个抽象动画类,无法直接使用,需要使用它的子类,动画分为两大类:属性动画和转场动画。属性动画顾名思义,针对图层可动画属性进行动画,转场动画通常用于视图切换,例如A视图切换为B视图。CAAnimation 针对的是图层而非视图,因此默认情况下,它在完成动画后恢复到最初状态,且不会改变视图的相关属性。

LOLITA0164的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

iOS 动画专题(UIView二维形变动画与CAAnimation核心动画)

1. iOS动画 总的来说,从涉及类的形式来看,iOS动画有:基于UIView的仿射形变动画,基于CAAnimation及其子类的动画,基于CG的动画。这篇文章着重总结前两种动画。 2. UIView动画 设置UIView形变动画有两种常见用到的属性,.frame,.transform,所以有的人也可以分别称之为: ① frame动画 ② transform动画 这两种动画只需要在...

H.A.N的博客 1690

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

CAAnimation,iOS动画,核心动画,CAAnimation动画

CAAnimation iOS动画演示,核心动画演示,CAAnimation动画,Core Animation框架

qq_26598077的博客 464

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

"MindManager"学习iOS系列之"CAAnimation-核心动画"详解,让你的应用“动”起来。

"MindManager"学习iOS系列之"CAAnimation-核心动画"详解,思维导图内展示了CAAnimation-核心动画的大多数基本功能和知识,每个part都有代码讲解,展示出CAAnimation-核心动画的清晰轮廓,编者提供了"JPG"、"SWF"、"PDF"、"Word"、"Mmap"格式的源文件供给使用。注意:JPG格式仅为图片总览,SWF格式使用微软IE浏览器浏览即...

aiganling0472的博客 169

iOS开发之CAAnimation核心动画

我们先来看看核心动画的组成,或者说事分类:如下图 核心动画简介:  核心动画:    1、在iOS中核心动画分为几类:基础动画(CABasicAnimation)、关键帧动画(CAKeyframeAnimation)、动画组(CAAnimationGroup)、转场动画(CATransition)    2、CAAnimati

ltj1171528192的博客 555

[转]iOS动画专题·UIView二维形变动画与CAAnimation核心动画(transform动画,基础,关键帧,组动画,路径动画,贝塞尔曲线)...

1. iOS动画 总的来说,从涉及类的形式来看,iOS动画有:基于UIView的仿射形变动画,基于CAAnimation及其子类的动画,基于CG的动画。这篇文章着重总结前两种动画。 2. UIView动画 设置UIView形变动画有两种常见用到的属性,.frame,.transform,所以有的人也可以分别称之为: ① frame动画 ② transform动画 ...

249

iOS CAAnimation(三)核心动画基础

layer在核心动画中的地位: 先看一下这个经典的结构图,Core Animation的位置在UIKit/AppKit层之下。 Core Animation is a graphics rendering and animation infrastructure available on both iOS and OSX that you use to animate the view...

CoderL 319

iOS动画专题·UIView二维形变动画与CAAnimation核心动画(transform动画,基础,关键帧,组动画,路径动画,贝塞尔曲线)...

1. iOS动画 总的来说,从涉及类的形式来看,iOS动画有:基于UIView的仿射形变动画,基于CAAnimation及其子类的动画,基于CG的动画。这篇文章着重总结前两种动画。 2. UIView动画 设置UIView形变动画有两种常见用到的属性,.frame,.transform,所以有的人也可以分别称之为: ① frame动画 ② transform动画 这两种动画只需要在动画语法中适...

weixin_33772645的博客 313

iOS 核心动画CAAnimation介绍

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34348805的博客 86

iOS动画专题·UIView二维形变动画与CAAnimation核心动画

点击上方“iOS开发”,选择“置顶公众号”关键时刻,第一时间送达!1. iOS动画总的来说,从涉及类的形式来看,iOS动画有:基于UIView的仿射形变动画,基于CAAn...

iOS_开发 278

iOS:核心动画的详解介绍:CAAnimation(抽象类)及其子类

核心动画的详解介绍:CAAnimation(抽象类) 1、核心动画基本概念 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! 使用它需要先添加QuartzCore.framework和引入对应的框架<QuartzCore/QuartzCore.h> ,在iOS7中不需要 2...

dienangpiao2051的博客 236

iOS开发概述 - 16.CAAnimation(核心动画实例)

1.CAPropertyAnimation(属性动画) 是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:CABasicAnimation CAKeyframeAnimation 要想利用CAPropertyAnimation实现动画,通过设定动画的keyPath属性来实现 keyPath:通过指定CALayer的一个属性名称为keyPath(NSString类型

MrRightZJ的博客 810

iOS动画编程

1、视图动画(UIViewAnimation) 可以改变视图的属性(Animatable UIView properties) frame:控制UIView的大小和该UIView在superview中的相对位置。 bounds:控制UIView的大小 center:控制UIView的位...

chunqingtai2922的博客 157
上一篇: 浅谈iOS之UIWebView
下一篇: 浅谈iOS持久化存储——沙盒存储
Flame_Dream
博客等级 码龄12年 35粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值