iPhone/iOS Core Animation开发总结(CALayer)

C++ 无法打开 源 文件「bits/stdc++.h」 VS 是不支持 万能头的,需要我们自己去手动添加。 原理 首先我们得知道万能头是个啥东西。(其实是我不知道。。QAQ) <bits/stdc++.h> 其实就是一个头文件,里面包含了几乎所有的C++库里的头文件。 因此一般只需要包含这一个头文件就能满足所有的需求。 不过自然也会有着一些缺点。 优点 简单便捷。能满足大多数场合,即一些对运行需求不大严格的场合。 节省时间,不必考虑需要加入哪些头文件。这对参与竞赛的时候能起到一点帮助。 缺点 包含所有的头文件,编译时速度自然就稍慢一些,增 阅读详情

一.重要参数

bounds,frame,position属于基本的几何定位,相互之间数值变化会相互影响

anchorPoint:单位参数(0-1)表示,变形(transform)时候的变换源点

zPosition:相当于css中z-index的概念,Apple建议不要用这个来替代CALayer层次设置。

cornerRadius:圆角


二.几何变形(Transforming a Layer's Geometry)

1.用CATransform3D系列方法

  1. //将CGAffineTransform转换成CATransform3D  
  2. layer1_1.transform=CATransform3DMakeAffineTransform(CGAffineTransformMakeScale(1, -1));  
  3. //CATransform3D系列方法  
  4. layer1_1.transform=CATransform3DMakeScale(-1, 1, 1);        
  5. layer1_1.transform=CATransform3DScale(CATransform3DMakeScale(-2, 1, 1), -1, 1, 1);  
  6. layer1_1.transform=CATransform3DIdentity;  

2.修改CATransform3D的data structure

  1. CATransform3D trans=CATransform3DIdentity;  
  2. NSLog(@"%f",trans.m44);  
  3. //不能是1除以,一定要1.0除以1000(zDistance)  
  4. //wrong     trans.m34=1/100.00  
  5. trans.m34=-1.0/1000;  
  6. trans = CATransform3DTranslate(trans, 0, 0, -240);  
  7. trans = CATransform3DRotate(trans, d2r(90), 1, 0, 0);  
  8. trans = CATransform3DTranslate(trans, 0, 0, 240);  
  9. [layer1 setTransform:trans];  

3.key-valre设置key Paths(rotation,scale,translation)
  1. [layer1 setValue:[NSNumber numberWithInt:200] forKeyPath:@"transform.translation.x"];  



三.Layer数层结构(Layer-Tree Hierarchy)

1.add,insert,remove,replace来进行树状结构的构建

2.重置(Reposition and Resizing)layer

a)你可以通过修改第一点提到的几个参数来调整大小。

b)needsDisplayOnBoundsChange设置YES,则在bounds变化时,自动调用setNeedsDisplay,调用layer的display的方法,或者直接显示调用setNeedsDisplay(不能使用setNeedsDisplayInRect),也会调用自定义layer的display方法。或者是setNeesLayout,调用layer的layoutSubLayers。(PS:无法使用layoutManager和autoResizingMask方法,这个是Mac OS上的方法。)

c)在UIView的layoutSubviews里实现自定义layout的方法。

3.masksToBounds设置YES,则裁剪subLayers。否则不裁剪,subLayers可以超过superLayer的bounds。

4.Action

当更改layer的参数或者将layer添加,删除,隐藏,替换时触发

触发方法可以是子类化CALayer,-(id<CAAction>)actionForKey:(NSString*)key;代理方式-(id<CAAction>)actionForLayer:(CALayer*) forKey:(NSString*)key

  1. -(id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event{  
  2.         CATransition *anim=nil;  
  3.         if([event isEqualToString:@"contents"]){  
  4.                 anim=[CATransition animation];  
  5.                 anim.duration=2;  
  6.                 anim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];  
  7.                 anim.type=@"cube";  
  8.                 anim.subtype=kCATransitionFromRight;  
  9.         }  
  10.         return anim;  
  11.         //不执行任何动画  
  12.         //return nil;  
  13. }  

苹果文档种提供了修改sublayers默认动画的方法

  1. NSMutableDictionary *cActions=[NSMutableDictionary dictionaryWithDictionary:[layer1_1 actions]];  
  2. [cActions setObject:[NSNull null] forKey:@"sublayers"];  
  3. layer1_1.actions=cActions;  


实现CAAction Protocol

代理类中实现方法runActionForKey:object:arguments

  1. -(void)runActionForKey:(NSString *)event object:(id)anObject arguments:(NSDictionary *)dict{  
  2.         NSLog(@"runActionForKey:\"%@\" object:%@ arguments:%@", event, anObject, dict);  
  3.         CATransition *anim=nil;  
  4.         if([event isEqualToString:@"test"]){  
  5.                 anim=[CATransition animation];  
  6.                 anim.duration=2;  
  7.                 anim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];  
  8.                 anim.type=@"cube";  
  9.                 anim.subtype=kCATransitionFromRight;  
  10.         }  
  11.   
  12.         [(CALayer*)anObject addAnimation:anim forKey:@"contets"];  
  13. }  

触发runActionForKey
  1. //添加自定义的action以及对应的触发方法所在的代理,应该可以定义一个动画子类(CAAnimation)  
  2. layer1.actions = [NSDictionary dictionaryWithObjectsAndKeys:[[FCLayerDelegate alloc]init], @"test", nil];  
  3. //实际触发的地方,当设置test参数,其实最后触发的是runActionForKey种的立方体旋转  
  4. [layer1 setValue:[NSNumber numberWithInt:19] forKey:@"test"];  



四.提供Layer内容(Providing Layer Content)

1.contents属性设置CGImageRef

  1. layer1.contents=(id)image1.CGImage;  
2.用delegate来提供内容

a)displayLayer:(CALayer*)

b)-(void)drawLayer:(CALayer*) inContext:(CGContextRef)

  1. //声明代理  
  2. @interface FCLayerDeledegate : NSObject  
  3. @end  
  4. //实现代理  
  5. @implementation FCLayerDelegate  
  6. //覆盖这个方法,就不会执行后面的方法,2者取其一,根据传入的值来判断下一步操作  
  7. -(void)displayLayer:(CALayer *)layer{  
  8. NSLog(@"%@",[layer valueForKey:@"test"]);  
  9. }  
  10. -(void)drawLayer:(CALayer *)ly inContext:(CGContextRef)context  
  11. {   
  12. CGContextSetFillColorWithColor(context, [[UIColor redColor]CGColor]);  
  13. CGContextFillRect(context, ly.bounds);  
  14. }  
  15. @end  
  1. //执行代码  
  2. CALayer* layer1_3=[CALayer layer];          
  3. layer1_3.delegate=[[FCLayerDelegate alloc]init];  
  4. [layer1_3 setValue:@"testString" forKey:@"test"];  
  5. [layer1_3 setNeedsDisplay];  

ps:以上方法用于CALayer本身(非自己子类)

3) 用子类提供内容

a)display

b)drawInContext:(CGContextRef)

和前面代理模式差不多,只不过少传layer参数,因为layer就是其本身(self);

4)内容的布局

默认情况下,内容图片是会铺开充满整个layer的bounds的,如果要使得contents按照原来尺寸显示在layer中,就要设置ContentsGravity

大致2种参数

1.位置参数,注意,ios坐标是y是相反的,所以bottom就是top

2.设置铺满方式,3种

  1. layer1_3.contentsGravity=kCAGravityBottomLeft;  
  2. layer1_3.contents=(id)image3.CGImage;  
  3. //layer1_3.contentsGravity=kCAGravityResizeAspectFill;  
PS:此外contentsCenter这个属性在铺满方式的参数下可以指定拉伸区域,文档中指出是指定拉伸的范围,但是似乎没有作用。暂时忽略。



五.动画

1.动画类簇


a)CAMediaTiming protocol的主要参数

speed:执行速度,如果速度为2,则一个10秒的duration,则只需要5秒完成。子类参数相对父类参数的,如果子类是2,父类是2,则需要2.5秒完成

repeatCount|repeatDuration:重复的次数和重复的间隔 ,如果repeatCount设置成 1e100f则无限重复

fillMode:决定动画结束时候的状态。要和removeOnCompletion参数一起设置才有效。动画结束后的状态并没有影响layer的位置,其实layer还在原来的地方没变。

此外还有duration,autoreverses,beginTime,timeOffset


b)CAAnimation

timingFunction:指定一个CAMediaTimingFunction,有2种提供方式,一种是常量如kCAMediaTimingFunctionLinear,另外一种是自定义2个control points来定制一个时间曲线

functionWithControlPoints::::。

delegate:2个代理方法animationDidStart:和animationDidStop:finished:


2.一般动画

任何CALayer的animated的属性或者CTM改变时候都是动画形式来过渡的,这个称为implicit Animation。这里不多做介绍

主要介绍下(Explicit Animation)显示动画

a)CABasicAnimation 针对某个属性的设置变化

  1. CABasicAnimation *anim;  
  2. anim=[CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];  
  3. anim.duration=8;  
  4. anim.autoreverses=NO;  
  5. anim.repeatCount=2;  
  6. anim.fromValue=[NSNumber numberWithFloat:d2r(0)];  
  7. anim.toValue=[NSNumber numberWithFloat:d2r(-90)];  
  8. //  layer1.transform=CATransform3DTranslate(CATransform3DIdentity, 0, 0, 100);  
  9. [layer1 addAnimation:anim forKey:@"layer1Rotation"];  

b)CAKeyframeAnimation

关键帧(key frame)有2种方式提供:

参数path,创建CGPathRef

path:CGPathRef 一般用于移动复杂的位置,如下例:

  1. CGMutablePathRef path=CGPathCreateMutable();  
  2. CGPathMoveToPoint(path, NULL, 40, 420);  
  3. CGPathAddCurveToPoint(path, NULL, 40, 40, 160, 40, 160, 420);  
  4. CGPathAddCurveToPoint(path, NULL, 160, 40, 280, 40, 280, 420);  
  5. CAKeyframeAnimation *anim=[CAKeyframeAnimation animationWithKeyPath:@"position"];  
  6. anim.path=path;  
  7. anim.duration=3;  
  8.   
  9. //图像在移动过程中是否旋转  
  10. anim.rotationMode=kCAAnimationRotateAuto;  
  11. //动画结束时候状态,我动画结束在哪里就停在哪里  
  12. anim.removedOnCompletion = NO;  
  13. anim.fillMode=kCAFillModeForwards;  
  14. //设置keyTimes path加了2个点,所以将duration设置成了2段,前面一段快3/10,后面一段慢7/10  
  15. anim.calculationMode=kCAAnimationLinear;  
  16. anim.keyTimes=[NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],[NSNumber numberWithFloat:0.3],[NSNumber numberWithFloat:1.0], nil];  
  17. [layer1 addAnimation:anim forKey:@"nm1"];  
  18. CGPathRelease(path);  

参数values:array of objects

如果objects是CGImage,key-path是"contents"的话,则是图像切换。

  1. CAKeyframeAnimation *anim=[CAKeyframeAnimation animationWithKeyPath:@"contents"];  
  2. anim.duration=3;  
  3. anim.values=[NSArray arrayWithObjects:(id)image1.CGImage,(id)image2.CGImage,(id)image3.CGImage,nil];  
  4. [layer1 addAnimation:anim forKey:@"nm2"];  
如果objects是CATransform3D的,key-path是“transform”,则是变换坐标

  1. CAKeyframeAnimation *anim2=[CAKeyframeAnimation animationWithKeyPath:@"transform"];  
  2. anim2.duration=3;  
  3. anim2.repeatCount=1000;  
  4. anim2.autoreverses=YES;  
  5. CATransform3D trans=CATransform3DScale(CATransform3DIdentity, 1.5, 1.5, 1);  
  6. CATransform3D trans2=CATransform3DScale(CATransform3DIdentity, 1, 1, 1);  
  7. anim2.values=[NSArray arrayWithObjects:[NSValue valueWithCATransform3D:trans],[NSValue valueWithCATransform3D:trans2],nil];  
  8. [layer1 addAnimation:anim2 forKey:@"nm3"];  
如果2个同时设置,还可以同时看到动画效果。比方说上述2个就可以看到图片切换并且放大和缩小的效果。
不要针对frame和size等参数设置keyframe动画,似乎没有效果。position是可以的。

3.动画事务(Transaction)

  1. [CATransaction begin];  
  2. [CATransaction setValue:[NSNumber numberWithFloat:.5f] forKey:kCATransactionAnimationDuration];  
  3. layer1.position=CGPointMake(0, 0);  
  4. layer1.opacity=0;  
  5. [CATransaction commit];  
通过事务可以修改implicit 动画的时间,否则没有办法修改。

4.动画过渡(Transition)

  1. //CATransition  
  2. CATransition *animation = [CATransition animation];  
  3. animation.delegate = self;  
  4. animation.duration = 2;  
  5. animation.timingFunction = UIViewAnimationCurveEaseInOut;  
  6. //animation.type = kCATransitionFade;  
  7. animation.type = @"cube";  
  8. animation.subtype = kCATransitionFromLeft;  
  9. //2个view交换  
  10. NSUInteger green = [[self.view subviews] indexOfObject:self.greenView];  
  11. NSUInteger blue = [[self.view subviews] indexOfObject:self.blueView];  
  12. [self.view exchangeSubviewAtIndex:green withSubviewAtIndex:blue];  
  13. [layer1 addAnimation:animation forKey:@"animation"];  
过渡有view的过渡和layer的过渡,2者是有区别的,网上有个例子transition包含了一共12种变换,相当有用。此外还可以设置startProgress和endProgress,这样就可以让动画执行到某个特定位置,比如说pageCurUp的话,就可以翻到一半,相当的酷哦!

六.CALayer的子类们

随着iOS 5.0的更新,CALayer添加了新的成员,我稍微研究了一些,现在做下总结,有的是新的,有的则是5.0以前的。

1.CAReplicatorLayer

顾名思义,这个类是用来创建重复的layer,并且可以根据设置的参数,进行一个渐变

  1. //每个单元的小layers设置  
  2. CALayer *layer1 = [CALayer layer];  
  3. layer1.position = CGPointMake(10,200);  
  4. layer1.bounds = CGRectMake(0, 0, 20, 20);  
  5. layer1.backgroundColor = [[UIColor yellowColor] CGColor];  
  6. layer1.cornerRadius = 2;  
  7. layer1.shadowColor = [[UIColor blackColor] CGColor];  
  8. layer1.shadowRadius = 4.0f;  
  9. layer1.shadowOffset = CGSizeMake(0.0f, 3.0f);  
  10. layer1.shadowOpacity = .8;  
  11. layer1.opacity = 0.8;  
  12. layer1.borderColor = [[UIColor whiteColor] CGColor];  
  13. layer1.borderWidth = 2.0;  
  14. //设置父容器  
  15. CAReplicatorLayer *xLayer = [CAReplicatorLayer layer];  
  16. xLayer.instanceCount = 11;//生成多少个字元素  
  17. xLayer.instanceDelay = .2;//延迟生成  
  18. xLayer.instanceGreenOffset = -.03;//绿色偏移量  
  19. xLayer.instanceRedOffset = -.02;//红色偏移量  
  20. xLayer.instanceBlueOffset = -.01;//蓝色偏移量  
  21. xLayer.instanceAlphaOffset = -.05;  
  22. xLayer.instanceTransform =CATransform3DMakeTranslation(25, 0, 200);//元素位移偏移量  
  23. [xLayer addSublayer:layer1];//将元素加入  
  24.   
  25.   
  26. xLayer.preservesDepth = YES;//superLayer是否启用3D景深计算  
  27. //设置景深  
  28. CATransform3D transform = CATransform3DIdentity;  
  29. transform.m34 = -1 / 2000.0f;  
  30. xLayer.transform=transform;  

甚至可以对layer加入组合式的动画,从而各个元素会有序的一起动画,主要的方法如下:

这个是针对layer的instanceTransform,从而可以影响每一个cell进行同样动画的移动,下面是进行平移的动画

  1. - (CABasicAnimation *)pushAnimation {  
  2.     CABasicAnimation *pushAnim =  
  3.     [CABasicAnimation animationWithKeyPath:@"instanceTransform"];  
  4.     pushAnim.fromValue =[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(SUBLAYER_WIDTH+INTERSPACE, 0, 0)];  
  5.     pushAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(SUBLAYER_WIDTH+INTERSPACE+60, 0, 0)];  
  6.     pushAnim.duration = 3.0;  
  7.     pushAnim.autoreverses = YES;  
  8.     pushAnim.repeatCount = HUGE_VAL;  
  9.     pushAnim.timingFunction =  
  10.     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];  
  11.     return pushAnim;  
  12. }  

2.CAEmitterLayer&CAEmitterCell

网上有很多粒子相关的代码,比如雪花的飘动,燃烧的火焰,烟雾效果,其实都是通过这个类的设置来实现的,用法和CAReplicatorLayer差不多,主要介绍下参数

  1.    // Configure the particle emitter to the top edge of the screen  
  2. CAEmitterLayer *snowEmitter = [CAEmitterLayer layer];  
  3. snowEmitter.emitterPosition = CGPointMake(self.view.bounds.size.width / 2.0, -30);//设置发射位置,这个和emitterMode有关  
  4.    snowEmitter.emitterZPosition=50;//发射点z的位置,这个和emitterMode有关  
  5. snowEmitter.emitterSize     = CGSizeMake(self.view.bounds.size.width * 2.0, 0.0);//发射点的范围,这个和emitterMode有关  
  6. snowEmitter.emitterDepth=100;  
  7.    //从线上发射  
  8.    //    snowEmitter.emitterMode        = kCAEmitterLayerOutline;  
  9.    //   snowEmitter.emitterShape    = kCAEmitterLayerLine;  
  10.    //从一个立方体内发射出,这样的话雪花会有不同的大小在3D的情况下  
  11.    snowEmitter.emitterMode      = kCAEmitterLayerVolume;  
  12. snowEmitter.emitterShape    = kCAEmitterLayerCuboid;  
  13.   
  14. //设置发射单元  
  15. CAEmitterCell *snowflake = [CAEmitterCell emitterCell];  
  16. snowflake.birthRate     = 3.0;//每秒发生1个  
  17. snowflake.lifetime      = 120.0;//生存时间为120秒  
  18. snowflake.velocity      = 20;               //初始速度  
  19. snowflake.velocityRange = 10;//初始速度的随机范围  
  20. snowflake.yAcceleration = 10;//y轴加速度,当然还有z,x轴  
  21.   
  22. //snowflake.emissionRange = -0.5 * M_PI;        // 发射角度范围 ,这个参数一设置,似乎方向只能朝屏幕内,就是z的负轴  
  23.      
  24.    snowflake.spin=0.0;  
  25. snowflake.spinRange     =- 0.25 * M_PI;     // 自旋转范围  
  26.   
  27. snowflake.contents      = (id) [[UIImage imageNamed:@"flake"] CGImage];  
  28. snowflake.color         = [[UIColor colorWithRed:0.600 green:0.658 blue:0.743 alpha:1.000] CGColor];  
  29.      
  30. // Make the flakes seem inset in the background  
  31. snowEmitter.shadowOpacity = 1.0;  
  32. snowEmitter.shadowRadius  = 0.0;  
  33. snowEmitter.shadowOffset  = CGSizeMake(0.0, 1.0);  
  34. snowEmitter.shadowColor   = [[UIColor whiteColor] CGColor];  
  35.      
  36.    //snowflake.emissionLatitude=-M_PI_2;//按照Z轴旋转  
  37.    snowEmitter.preservesDepth=YES;  
  38.    CATransform3D transform = CATransform3DIdentity;  
  39.    transform.m34 = -1.0/300.0f;  
  40.    self.view.layer.transform=transform;  
  41.      
  42. // Add everything to our backing layer below the UIContol defined in the storyboard  
  43. snowEmitter.emitterCells = [NSArray arrayWithObject:snowflake];  
  44. [self.view.layer insertSublayer:snowEmitter atIndex:0];  

主要是3DZ轴方向的应用,如果越靠近你的视野,则图片更大,这个效果可以通过设置父Layer的景深来实现。


参考文档:

Animation Types and Timing Programming Guide

Core Animation Programming Guide


Visual Studio 2022配置bits/stdc++.h全指南:从手动添加到CMake自动化 本文详细介绍了在Visual Studio 2022中配置C++万能头文件bits/stdc++.h的三种方法,包括手动添加、vcpkg管理和CMake自动化集成。针对不同规模的项目需求,提供了从基础到高级的配置方案,帮助开发者提升编译效率并优化工程实践。特别适合需要在Windows平台使用这一GCC特性的C++开发者。 阅读详情

相关推荐

VC++2010兼容bits/stdc++.h万能头文件:原理、定制与工程实践

C++标准库头文件是程序与底层功能交互的桥梁,其包含机制直接影响编译效率与代码可移植性。不同编译器厂商(如GCC的libstdc++与微软的MSVC STL)在标准库实现上存在差异,这导致了头文件组织方式的不同。理解这些平台差异对于解决跨环境编译问题至关重要,尤其在维护老旧项目或确保代码在多平台兼容时。bits/stdc++.h作为GCC/Clang生态中流行的非标准“万能头文件”,因其一次性包含大量常用头文件而受到竞赛编程和快速原型开发的青睐,但其在Visual C++ 2010等MSVC环境中缺失。本文

weixin_33700350的博客 353

真正强大的核心动画(Core Animation)

Core Animation简路径介 Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,也就是说,使用少量的代码就可以实现非常强大的功能 Core Animation可以用在Mac OS X和iOS平台 Core Animation的动画执行过程都是在后台操作的,不会堵塞主线程 需要注意的是:Core Anim...

weixin_44729579的博客 449

Visual Studio 2022 C++项目缺失bits/stdc++.h的三种修复路径与原理剖析

本文详细解析了Visual Studio 2022中C++项目缺失bits/stdc++.h头文件的三种修复方法,包括手动创建、项目配置和使用vcpkg安装GCC头文件。通过对比各方案的优缺点,帮助开发者根据项目需求选择最佳解决方案,提升开发效率。

weixin_33744854的博客 429

iOS核心动画-3

第四章 图层树的层次结构 图层不但给自己提供可视化的内容和管理动画,而且充当了其他图层的容器类, 构建图层层次结构。 本章介绍了图层层次结构,以及如何操纵该图层层次结构。 4.1 什么是图层树的层次结构 图层树是核心动画里面类似 Cocoa 视图的层次结构。比如一个 NSView 或者UIView 的实例拥有父视图(superview)和子视图(subview)

super_man_ww的博客 835

VS2019手动添加bits/stdc++.h全指南(附解决‘无法打开源文件‘错误)

本文详细介绍了在Visual Studio 2019中手动配置C++万能头文件bits/stdc++.h的完整方法,解决常见的'无法打开源文件'错误。通过分析GCC与MSVC编译器生态差异,提供了纯手动创建和MinGW移植两种可靠方案,并给出详细的步骤、常见错误排查及最佳实践建议,帮助开发者高效配置竞赛开发环境。

weixin_29011395的博客 545

C++万能头文件 bits/stdc++.h 的用法和优缺点 包含哪些文件头

它是C++中支持的一个几乎万能的头文件,几乎包含所有的可用到的C++库函数。以后写代码就可以直接引用这一个头文件了,不需要在写一大堆vector、string、map、stack……int main() { // write code here}#if __cplusplus >= 201103L #include #include #include #include #include ...

星卯教育-信奥教练tony 5460

iOS动画-核心动画(Core Animation)

iOS动画篇:核心动画 iOS动画详解(学习动画看这一篇就够了) 基本概念 1. 什么是核心动画 Core Animation(核心动画)是一组功能强大、效果华丽的动画API,无论在iOS系统或者在你开发的App中,都有大量应用。其处于QurtzCore框架内。 核心动画所处位置: 可以看到,核心动画位于UIKit的下一层,相比UIView动画,它可以实现更复杂的动画效果。 核心

leiyutinghua的博客 548

iOS-CoreAnimation动画集

iOS CoreAnimation动画集Demo,清晰的关键代码。 支持移动、旋转、缩放、曲线运动、组合运动、弹簧运动、转场动画、添加购物车动画等等。 详情博客:http://blog.youkuaiyun.com/yutianlong9306/article/details/52788582

iOS CoreAnimation动画详解(一)

Core Animation是作用于CALayer上的动画,具有跨平台性,性能很高,而且动画的执行不会阻塞主线程。 每一个继承与UIView的子类都有一个layer属性,可以通过这个layer来为更改相应view的形式,或者做动画。 继承结构: 动画类解释: CAAnimation:核心动画的基础类,不能直接使用,负责动画运行时间、速度的控制,本

开发之谈 654

新手也能搞定的ANPC三电平逆变器Simulink仿真:从SPWM调制到开关损耗优化

本文详细介绍了如何在Simulink中搭建ANPC三电平逆变器仿真模型,从SPWM调制基础到开关损耗优化技巧。通过分层设计思路和实用代码示例,帮助新手快速掌握ANPC拓扑的核心功能,包括中点平衡控制和性能指标分析,为电力电子系统设计提供实践指导。

weixin_30335575的博客 405

从Blender舞步到夜空画卷:基于Pix飞控的无人机编队灯光秀全链路开发实践

本文详细介绍了基于Pixhawk飞控的无人机编队灯光秀全链路开发实践。从Blender三维动画设计、QGroundControl地面站二次开发与MAVLink通信桥接,到PX4飞控的OFFBOARD模式路径控制与LED灯光驱动实现,最后通过Gazebo仿真验证并完成真机组装与首飞。文章为无人机爱好者提供了一套完整的、从创意设计到夜空执行的开源解决方案,重点阐述了多机同步与灯光控制的核心技术挑战与应对策略。

zeta9的博客 584

【一天一个计算机知识】——【如何在VS中配备万能库】一文带你如何在 VS 入手<bits/stdc++.h>

万能头文件指南 本文详细介绍了在Visual Studio中手动添加GCC编译器特有万能头文件<bits/stdc++.h>的方法: 定位include目录:找到VS安装路径下的MSVC编译器include文件夹 创建bits子目录:在include文件夹内新建bits文件夹 添加头文件:创建stdc++.h文件并写入兼容MSVC的代码 测试验证:通过简单的vector排序程序验证配置成功 操作步骤包含完整的路径说明和注意事项,

枫亭湖区的博客 502

蓝牙开发实战:如何用Wireshark抓取HCI协议包(附完整分析步骤)

本文详细介绍了如何使用Wireshark抓取和分析蓝牙HCI协议包,包括环境搭建、过滤器配置技巧、数据包深度解析及高级调试方法。通过实战案例,帮助开发者快速定位蓝牙连接问题,提升调试效率。

cuda7parallel的博客 1148

C++竞赛选手必看:万能头文件bits/stdc++.h的实战技巧与性能优化

本文深入解析C++竞赛中广泛使用的万能头文件bits/stdc++.h,涵盖其本质、优势与编译性能瓶颈。重点提供主流OJ平台兼容性指南与实战提交策略,并分享利用预编译头技术优化编译速度的实用技巧,帮助选手在享受便捷的同时规避潜在风险。

vulkan6gpu的博客 705

从零到一:如何用GraphRAG Visualizer打造你的第一个3D知识图谱

本文详细介绍了如何使用GraphRAG Visualizer从零开始构建3D知识图谱,涵盖环境准备、Parquet数据处理、可视化操作及高级分析功能。通过简洁的步骤和实用技巧,帮助用户快速掌握这一强大的知识图谱可视化工具,提升数据分析和关系挖掘效率。

rock5的博客 216

瑞萨芯片串口配置,基于RL78芯片的串口使用配置

在这里隆重给大家介绍瑞萨编辑器CS+ for CA 的自动生成代码功能,只需要配置几个参数,就可以得到你想要的串口配置了,我现在已经忘记怎么手动配置寄存器了,哈哈。选择设置,此时将端口设置成功接下来设置时钟,根据自己的芯片所需设置相应的时钟,自己芯片是什么时钟查看数据手册和原理图可以找到。瑞萨芯片的串口配置其实和ST芯片的串口配置差不多,只是ST芯片的中文数据手册比较多,就更好配置了,找到所需要的串口配置IO口,此时将UART0 配置为引脚P61和P62,瑞萨芯片的串口配置竟然要配置串口。

qq_45315904的博客 4302

解决VS2022无法打开源文件<bits/stdc++.h>的问题

这应该是因为vs2022内没有<bits/stdc++.h>这个头文件,给他加进去就好了。

2402_89493910的博客 629

计算机视觉:AI生成内容(AIGC)对视觉领域的冲击

计算机视觉:AI生成内容(AIGC)对视觉领域的冲击​ 人工智能,计算机视觉,大模型,AI,在信息技术日新月异的当下,计算机视觉作为人工智能领域的关键分支,已经深度融入了我们生活与工作的各个层面。从安防监控系统里精准的人脸识别,助力维护公共安全;到工业生产线上高效的产品质量检测,保障产品品质;再到医疗影像分析中为疾病诊断提供有力支持,计算机视觉技术凭借其对视觉信息的强大处理与理解能力,不断推动着各行业的发展与变革。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 17万+

无法打开源文件“bits/stdc++.h”

近期一段时间开始使用VScode 撸码,发现支持万能头,此时我们需要将该头文件放到VS的头文件库中 如果安装了MinGW的话(好像都有把,不然怎么配置VScode的C++环境),没有的话看方法2。***注意最后需要重启VScode *** 方法1:找到MinGW 的文件夹,找一个bits的文件夹,类似路径. C:\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\x86_64-w64-mingw32\bits 如果不好找的话,在MinGW 的主文件夹下搜

嘘...一只bug 1万+

《FPGA接口与协议》专栏的说明与导航

《FPGA接口与协议》专栏的说明与导航(建议阅读)。

孤独的单刀 17万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

include<bits/stdc++.h>

#include<bits/stdc++.h>包含了目前c++所包含的所有头文件,是个万能库。 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue>

cloudless_sky的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++竞赛选手必看:如何用bits/stdc++.h头文件提升刷题效率(附VS Code配置指南)

本文详细介绍了C++竞赛中万能头文件bits/stdc++.h的高效使用方法,包括VS Code配置指南、编译时间优化技巧及竞赛场景下的实战策略。通过预编译头技术和自定义配置,选手可显著提升刷题效率,避免常见编译错误,适合ACM/ICPC等编程竞赛选手参考。

websocket5live的博客 453

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

dev万能头文件_Dev c++ 支持bits/stdc++.h万能头文件吗

#include包含了目前C++所包含的所有头文件。它包含了以下头文件(C++)://C++头文件#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #includ...

weixin_39615991的博客 1643

C++竞赛选手必看:万能头文件bits/stdc++.h的实战技巧与隐藏坑点

本文深入探讨了C++竞赛编程中万能头文件bits/stdc++.h的实战技巧与潜在问题。通过分析其在ACM/ICPC等竞赛中的优势、主流OJ平台的兼容性情况,以及编译效率优化和调试技巧,帮助选手在比赛中高效使用这一强大工具,同时规避常见陷阱。

weixin_30825581的博客 571
上一篇: iOS 设置束
下一篇: iPhone/iOS图片相关(读取、保存、绘制、其它相关)
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值