付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Cocoa系统丰富动画效果,带给用户很多独特的视觉和使用体验。CoreAnimation在UI系统架构中处于关键位置,它是图形渲染和动画的基础,依赖底层的硬件加速特性,CoreAnimation可以获得更能,CoreAnimation提供了多种不同的特性的图层Layer满足不同场景中使用动动画产生过动画的本质是图形对象在坐标系统中基于时间参数变化,可以简单的用数学公式描述如下Pn=Ft(p)其中Pn和p分别表示为图形某个属性变化后值和变化前的值,Ft为时间函数举一个例子,要实现把小球从A点移动到B点的动画,首先需要确定球的运动轨迹,然后在轨迹曲线上确定一些关键坐标点然后在不同时刻移动小球到关键位置,这样就完成了一次动画。CoreAnimation提供了几种常见的动画控制函数Linear线性:EaseIn淡入:EaseOut淡出:EaseInOut淡入淡出:开始慢,中间匀速,最后除了这些之外还可以通过CGPat,曲线灵活的定义动画控制函数来实现各种动画。使用CoreAnimation动画框架,修改视图层的属性,自动使用默认的控制函数产生动画效果层Layer代表了3D空间中2D图形的表面,它是CoreAnimation的,跟视图有一些相同概念,括坐标系统,可视化的属性等等Layer可以认为是视图bitmap的模型管理类,代表了图形学中的2D对象iOS系统中,每个UIView系统都会默认创建一个层Layer;而在OSX系统中,必须指定需要使用层即设置NSView对象的wantsLayer属性为YES,而且它的所有子视图也自动允许使用层属性ViewA有2个子视图ViewBViewC,在iOS每个视图都默认有一个对应的layer层属性,可OSX中设置了视图允许使用层wantsLayer属性为YES后,它的所有子视图也默认允许使用层在OSX中设置ViewA的wantsLayer属性为YES以后,它的子视图ViewB和ViewC就能直接使用视图与Layr不同的是视图支持各种用户交互事件和属性Layr仅仅是一个几何图形或图象,不具备用户交互特征和功能;视图中的绘制在CP执行CLayr绘制在GP执行。支持aer的视图称为layer-baced的视图,iOS中的视图,SX中视图设置wantaer为YS后,都是laer-baced的视图。laer-baced的视图有系统负责aer的管理创建,以及视图和er之间内容同步,比如修改了视图的几何属性(大小,位置等),能同步到ae。除了layer-baced的视图,SX中还可以创建基于lae-oig的视图,ApKt不再管理这个ae,视图跟layer-hoig的ayer同步需要自己编程处理。视图是层的,实现了CALayerDelegate协议。层在渲染显示时,调用链关系依次如从上面的调用关系看出,通过NSView/UIViewdrawLayer:inContext:或drawRect:方法,可以实+(+(Class)layerClassreturn[CAMetalLayer}在OSX中可以使用下面的方法给视图配置一个自定义的-(-(CALayer*)makeBackingLayerreturn[[CustomLayerclass]alloc]init}坐标系般被分为基于点的坐标系统和基于像素的坐标系统。点的坐标系统是一种逻辑标,跟设备无关,一个点跟一个像素不是一一对应的。在Layer层中,引入了一种新的单位标系统,每个坐标轴值的范围都是0到1之间,单位坐标系统是针对aer的本身的Bouns来定义的,也相当于对Bounds进行了单位化归一处理,achoroint用来规定aer的位置参考点,ae层的position属性是根据层的frame和Achoroint计算得出的anchorPointanchorPoint在iOS/OSX中单位坐标定义如下下面是层在改变的AnchorPoint情况下position的变化Laer的旋转变换是以crPt做为旋转的参考轴来进行的,因此对于同一个Layr不同的crPt坐标会带来不同的变换效果。层的坐标系统转CALayer提供了不同图层之间坐标转换的方法,包括Point和Rect-(CGPoint)convertPoint:(CGPoint)pfromLayer:(CALayer-(CGPoint)convertPoint:(CGPoint)ptoLayer:(CALayer类似于坐标系统,不同层的系统时钟也是本地化的,每个层使用本地时间系统来管理动画。CALayer层提供了2CACurrentMediaTime函数可以得到计算机的全局时间,通过转换获取层的本地时间CFTimeIntervalCFTimeIntervallocalLayerTime=[myLayerconvertTime:CACurrentMediaTime()Layer定义了3种不同的对象树,分别模型对象树modellayer:用户交互的对象的模型,Layer的各种属性值,比如移动到某个位置点,目标点的坐标就在对象树中selfself.imageView.wantsLayer=CALayer*theLayer=self.imageView.layer;CALayer*modelLayer=theLayer.modelLayer;NSLog(@"modelLayeropacity%f展示对象树presentationtree:动画运动过程中不同时刻展示的动态的属性值,反映屏幕上CALayer*presentationLayer=theLayerCALayer*presentationLayer=theLayer.presentationLayer;NSLog(@"presentationLayeropacity%f",presentationLayer.opacity);渲染对象树rendertree:动画渲染时使用,系统私有对象,不提供对外接口类似于NSView/UIView,Layer提供了层级管理方法增加-(void)addSublayer:(CALayer层-(void)insertSublayer:(CALayer*)layer-(void)insertSublayer:(CALayer*)layerbelow:(nullableCALayer-(void)insertSublayer:(CALayer*)layerabove:(nullableCALayer替换-(void)replaceSublayer:(CALayer*)layerwith:(CALayer删除-Layer提供@property(readonly)CALayer*superlayer;@property(copy)NSArray*sublayers;Layer有contents内容属性,可以是来自Layer的绘制方法,或者来自一个指定的,总共有3类Layer的内容来自UIImageUIImage*image=[UIImageimageNamed:@"gradintCell"];blueLayer.contents=(bridgeid)image.CGImage;OSX系统实NSImageNSImage*image=[NSImageimageNamed:@"gradintCell"];blueLayer.contents=image;通过Layer方有2个方法,只需要实现其中一种即可,2种方法都实现时,只会调用第一种NSImage*image=[NSImageimageNamed:@"gradintCell"];theLayer.contents=image;}CGContextSetFillColorWithColor(theContext,[NSColorblueColor].CGColor);CGContextFillRect(theContext,theLayer.bounds);}子类化通过子类化CALayer,提供Contents内容。只需要实现下面2种任意法。display方法要直接提供图象给contents,drawInContext方法可以通过绘图函数自己实现自定义图形绘制NSImageNSImage*image=[NSImageimageNamed:@"gradintCell"];self.contents=image;}{CGContextSetLineWidth(ctx,4.0f);CGContextSetFillColorWithColor(ctx,[NSColorblueColor].CGColor);CGContextFillRect(ctx,self.bounds);}层的深度层的zPosition决定了显示的顺序,zPosition最大的层显示在最外层CALayer*parentLayer=myView.layer;CALayerCALayer*parentLayer=myView.layer;CALayer*blueLayer=[CALayerlayer];blueLayer.frame=NSMakeRect(10,10,100,100);blueLayer.backgroundColor=[NSColorblueColor].CGColor;[parentLayeraddSublayer:blueLayer];CALayer*greenLayer=[CALayerlayer];greenLayer.frame=NSMakeRect(20,20,100,100);greenLayer.backgroundColor=[NSColorgreenColor].CGColor;[parentLayeraddSublayer:greenLayer];CALayer*redLayer=[CALayerlayer];redLayer.frame=NSMakeRect(30,30,100,100);redLayer.backgroundColor=[NSColorredColor].CGColor;[parentLayeraddSublayer:redLayer];如果修改greenLayer的zPosition为500,修改前后显层的投影使用subLayerTransform变换来产生投影,设置3D变换矩阵中的m34字段即可CALayer*parentLayer=myView.layer; =CATransform3DIdentity;.m34=-parentLayer.sublayerTransform CALayer*blueLayer=[CALayerlayer];blueLayer.frame=NSMakeRect(10,10,100,100);blueLayer.backgroundColor=[NSColorblueColor].CGColor;blueLayer.zPosition=50;[parentLayerCALayer*greenLayer=[CALayerlayer];greenLayer.frame=NSMakeRect(20,20,100,100);greenLayer.backgroundColor=[NSColorgreenColor].CGColor;greenLayer.zPosition=80;[parentLayerCALayer*redLayer=[CALayerlayer];redLayer.frame=NSMakeRect(30,30,100,100);redLayer.backgroundColor=[NSColorredColor].CGColor;redLayer.zPosition=200;[parentLayerLayer动隐式动画:无需配置系统按默认参数实现的动画(动画持续时间为2秒)。对ayer(frmVae,修改后为tVae会产生frmVaeVae平滑过的动画属性的值会立即更新到meLaer模型树对象而展示树resetatLayer。只有新创建的Layer修改属性会产生隐式动画。UIView/NSView每个视图对应的层,layer-backed层,修它的属性并不能产生隐式动画下面是一个隐式动画的例子:创建一个背景层gLyermVe的ayr上做为子层。点击按钮使背景层gLayer。iOS{[superCALayer*bgLayer=[CALayerlayer];bgLayer.frame=CGRectMake(10,10,50,50);bgLayer.backgroundColor=[UIColorredColor].CGColor;[self.myView.layeraddSublayer:bgLayer];self.bgLayer=bgLayer;}- selfself.bgLayer.opacity=}OSX中隐式{[superCALayer*bgLayer=[CALayerlayer];bgLayer.frame=CGRectMake(10,10,50,50);bgLayer.backgroundColorUIColorredColor].CGColor;self.myView.wantsLayer=YES;//要求myView使用层[self.myView.layeraddSublayer:bgLayer];self.bgLayer=}{self.bgLayer.opacity=}显式动画:通过[CALayeraddAnimation:forKey:]显式的增加动画(设置属性变化值,动画持续时CABasicAnimationCABasicAnimation*animation=[CABasicAnimationanimation];animation.fromValue=...;animation.toValue=...anchorPoint:contents:内contentsRect:内容opacity:不shadowOpacity:阴影不 zPosition:比如transform支持的子属性可以使用setValue:forKeyPath:方法直接修层属性层动画属性的修改,不支持简单的值数据或结构体数据,需要使用值类型对象进行包装对空间数据结构需要使用值类型CGPointNSValueCGSizeNSValueCGRectNSValueCATransform3DNSValueCGAffineTransformNSAffineTransform(OSX下面是一个实现视图位置移动的显式动画的例子iOS实CGPointCGPointmyNewPosition=CGPointMake(100,CABasicAnimation*theAnim=[CABasicAnimationanimationWithKeyPath:@"potheAnim.fromValue=[NSValuevalueWithCGPoint:self.myView.layer.positio =[NSValuevalueWithCGPoint:myNewPosition]; =3.0;OSX实现:有3通过修个层的position属NSPointNSPointmyNewPosition=CABasicAnimation*theAnim=[CABasicAnimationanimationWithKeyPath:@"potheAnim.fromValue=[NSValuevalueWithPoint:self.myView.layer.position]theAnim.toValue=[NSValuevalueWithPoint:myNewPosition];theAnim.duration=3.0;上面代码并不能产生动画效果,需要将myView的父视图设置为允许使用层如下{[self.window.contentView}通过层在3D空间XY轴平CABasicAnimationCABasicAnimation*animation=[CABasicAnimationanimationWithKeyPath:@"transanimation.duration=2.0; animation.repeatCount=animation.fromValue=[NSValue addAnimation:animation上述方法同样的需要设置myView的父视图为允许使用层通过NSViewAnimation定义动NSRectNSRectstartFrame=[self.myViewNSRectendFrame=NSMakeRect(100,100,startFrame.size.width,startFrame.size.hNSDictionary*dictionary=[[NSDictionaryalloc]initWithObjectsAndKeys: [NSValueNSViewAnimation*animation=[[NSViewAnimationalloc]initWithViewAnimations:[Nanimation.duration=2;[animationsetAnimationCurve:NSAnimationEaseIn];[animation动画对可以分为动画/协议/工具/事务4大类动画基础类,定义了通用的属性和方法@interface@interfaceCAAnimation:+(id)defaultValueForKey:(NSString//动画效果控制函数动画协定义了动画开始执行和结束后的回调接口@interface@interfaceNSObject-(void)animationDidStart:(CAAnimation属性动画即基于某个属性来产生动画。这里的属性要特别说明一下的实际属性这些属性只有要进行动画的时候才能使用称之为虚拟属性(比如trafmrtatn不能做为Laer属性直接设置)。@interface@interfaceCAPropertyAnimation://创建属性动画,path规定产生动画的属性 //动画属性对应的@property(copy)NSString//additive为动画规定的values值在当前值基础上叠加做为新的值去渲染,也就是说values中规定@property(getter=isCumulative)BOOLcumulative;//tranform变换对应的函数最基本的值变化动画,指定初始值fromValue和结束值toValue,系统使用默认的动画效果动画byValue不是必须的,可用来规定变化的步长,fromValue加上byValue做为下一个新值frmVae和tVae不一定要同时设定如果mVae为空则表示产生从当前值到tVa的。如果toValue为空则表示产生从fromValue到当前值的动画@interface@interfaceCABasicAnimation://@property(strong)id//@property(strong)id关键帧动画,分为基于关键帧数据的动画和基于路径的动画2种@interfaceCAKeyframeAnimation://@property(copy)NSArray@property(copy)NSArray<NSNumber*>*keyTimes;//时间函数,用来指定values中帧数值之间的过渡的变化函数,其元素个数必须为values中元素个数减1。@property(copy)NSArray<CAMediaTimingFunction*>*timingFunctions;//@property(copy)NSString//Cubic曲线对应的控制参数@property(copy)NSArray*tensionValues;@property(copy)NSArray*continuityValues;@property(copy)NSArray*biasValues;//旋转模式,设为非空值可以沿着路径方向旋转,//计算模式(插值算法NSString*constkCAAnimationDiscrete//离散点,只显示关键帧的状态,没有中间过程和动画。NSString*constkCAAnimationPaced//平滑的速度NSString*constkCAAnimationCubic//圆滑曲线NSString*constkCAAnimationCubicPaced//圆滑加均匀基本动画和关键帧动画每次只能对一个属性进行动画,而组动画可以将任意的单一属性动画组组,同时在多个属性产生动画@interface@interfaceCAAnimationGroup:CAAnimation@property(copy)NSArray<CAAnimation*>*animations;转场动画不是对层属性来做动画而是特指2个不同的层即场景切换时产生的动画。一张切换到另外一张个视图之间的切换等等。@interface@interfaceCATransition:CAAnimation@property(copy)NSString*type;//动画类型@propertycopyNSString*subtype;//子类型@propertyfloatstartProgress;//开始时间百分比系数,默认为0@propertyfloatendProgress;//结束时间百分比系数,默认为1@property(strong)id//转场变换类型NSString*constkCATransitionFade//淡入NSString*constkCATransitionMoveIn//淡出NSString*constkCATransitionPush//压入NSString*constkCATransitionReveal//融入//NSStringNSString*constkCATransitionFromRight//从右侧NSString*constkCATransitionFromLeft//从左侧NSString*constkCATransitionFromTop//从顶侧NSString*constkCATransitionFromBottom//从顶部类似弹簧的阻尼@interface@interfaceCASpringAnimation:@propertyCGFloatmass;@propertyCGFloatstiffness;@propertyCGFloatdam //@propertyCGFloat//延时2CFTimeIntervalCFTimeIntervallocalLayerTime=[myLayerconvertTime:CACurrentMediaTime()theAnimation.beginTime=localLayerTime+2;theAnimation.duration=5.0;动画时间5秒,没有延时与延时2秒的对timeOffset(动画帧的偏移量CFTimeIntervalCFTimeIntervallocalLayerTime=[myLayerconvertTime:CACurrentMediaTime()theAnimation.timeOffset=localLayerTime+2;theAnimation.duration=5.0;动画时间5秒,没有timeOffset与timeOffset2秒后的对比speed(动画速度动画速度影响动画的持续时间,速度越大,动画时间越短,速度默认是。动画持续时间计算公式如下duration=duration/repeatCount(重复次数)repeatDuration(重复的时间repeatCount和repeatDuration只需要按需要设置其一。同时设置时取时间最短的一个autoreverses自动反动画完成后在按原路返回。比如原本秒的动画帧序列为C设置atrevers为S后执行结果为CCBA。fillModekCAFillModeRemoved:默认无填充kCAFillModeForwards:动画结束后维持最后一个时刻的状态。例如5秒的动画 结束后维持在状态。结合设置动画的 kCAFillModeBackwards:当动画的beginTime不为0时,动画创建完成,未开始之前的时间内一直延时2秒的动画kCAFillModeBackwards填充模式示kCAFillModeBoth:是kCAFillModeBackwards和kCAFillModeForwards2种情况的结合动画动作协议从动画对象图谱中可以看出动画的基类Cmat实现了Cct协。修改单独的层属性触发隐式动画隐式动画查找每个属性对应的实现了Cct协议的动画对象(即缺省的动画类大多数情况下为Cacmat),动画对象执行Cct协议runActionForKey:object:arguments方法,将自己加入系统动画队列等待执行@protocol@protocol-(void)runActionForKey:(NSString*)eventobject:(id)anObjectarguments:(nullableNSDictionary*)dict;隐式layer.opacity=借助于CAAction协议,相当于CABasicAnimationCABasicAnimation*animation=[CABasicAnimationanimation];animation.toValue=@.5;@interface@interfaceCAMediaTimingFunction:NSObject// 曲+(instancetype)functionWithControlPoints:(float)c1x:(float)c1y:(float)c2x- //NSString*constkCAMediaTimingFunctionLinearNSString*constkCAMediaTimingFunctionEaseInNSString*constkCAMediaTimingFunctionEaseOutNSString*constkCAMediaTimingFunctionEaseInEaseOutNSString*const@interface@interfaceCAValueFunction:NSObject@property(readonly)NSString*name;NSString*constkCAValueFunctionRotateXNSString*constkCAValueFunctionRotateYNSString*constkCAValueFunctionRotateZNSString*constkCAValueFunctionScaleNSString*constkCAValueFunctionScaleXNSString*constkCAValueFunctionScaleYNSString*constNSString*constkCAValueFunctionTranslateNSString*constkCAValueFunctionTranslateXNSString*constkCAValueFunctionTranslateYNSString*const 成对使用定义动画可以嵌套使用必须保证 的隐式动画实际上是使用CATransaction的方式定义后提交到任务调度的runLoop等待执行使用Cractn的方式可以更灵活的指定动画的时间完成后的ck回调指定动画效果的。@interface@interfaceCATransaction:++//动画持续的时间,默认为0.25++//动画时间变换函数,默认为+(nullableCAMediaTimingFunction//动画默认的action开关,初始值为++////动画完成+(void+ pletionBlock:(nullablevoidCATransaction支持KVC形式的setValue:forKey:设置和属下面是系统预定义的个key,分别对应Crctn类中定义的个接口方法。除了系统的定义的之外可以定义自己的key来传入参数,在整个CAraction上下文中。NSString*constkCATransactionAnimationDurationNSString*constkCATransactionDisableActionsNSString*constkCATransactionAnimationTimingFunctionNSString*const 下面是使用CATransaction[CATransactionsetAnimationDuration:1];关闭隐式动画的self.bgLayer.opacity=0.2;动画的动作控 1.1.查找实现了CAAction协议修改一个层的属性,立即触发它的actionForKey:方法去查找CAAction类型对象,查找流程依次优先检测层是否有elgae并且实现了acioFoaer:foy:方法,如果有返回AAction类型对象,则返回这个对象;如果返回il则继续分支流程处理;如果返回NSNl则结束后续搜索分支通过key查找层的actions字典,如果查找成功则返回CAAction类型对象,否则继续下一步去查查找层的yle字典中的y为action的字典,如果不为空则在新的action字典中继续用y去查找执行层的defaultActionForKey:方法2.执行CAAction协议,创建一个对搜索到的动画对象,执行Cctn协议方法rctFrKey:ectagmet:,这个方法的第一个参数key为一个CLayer属性名称,第二个参数oect为CLayer层对象。执行的过程是在CLyer层上根据属性参数修改前和修改后的值,通过层的amatfrKe:方法,创建一个显式动画。对于正常的NSView/UIView的layer的属性修改,并不产生隐式动画的原因在于执行上述隐式根据CLaer层中查找Cct动画对象的执行过程可以根据属性参数进行返回指定的动画对象来影响只求默认返回的动画。修改CALayer中actionForKey:方bounds变化的动{if([eventisEqualToString:@"bounds"])returnnil;return[super}2.2.修改视图NSView/UIView中实现的actionForLayer:forKey:层的内容变化时,实现一个自定义转场-(id-(id<CAAction>)actionForLayer:(CALayer*)layerforKey:(NSString{if([keyisEqualToString:@"contents"])CATransition*theAnimation=[[CATransitionalloc]init];theAnimation.duration=1.0; =kCATransitionPush;returntheAnimation;}return[superactionForLayer:layerforKey:key]}动画执行完成后,可以使用方法或动画事务完成块Block得到回调通知CABasicAnimation*animation1=[CABasicAnimationanimation];animation1.keyPath=@"borderWidth";animation1.toValue=@(10);animation1.delegate=}{ =}动画事务完成Block回CABasicAnimation*animation1=[CABasicAnimationanimation];animation1.keyPath=@"borderWidth";animation1.toValue=animation1.delegateanimation1.delegate=[CATransactioncommit]; =暂停-(-(void)pauseLayer:(CALayer*)layerCFTimeIntervalpausedTime=[layerconvertTime:CACurrentMediaTime()layer.speed=0.0;}恢复-(-(void)resumeLayer:(CALayer*)layer{CFTimeIntervalpausedTime=[layertimeOffset];layer.speed=1.0;layer.timeOffset=layer.beginTime=CFTimeIntervaltimeSincePause=[layerconvertTime:CACurrentMediaTime()fromLayer:nil]-pausedTime;layer.beginTime=}OSX中的视图动NSView/NSWindow实现了NSAnimatablePropertyContainer,当视图的的变化时,可以产生动画效果;通过animator可以透明的使用这些属性来产生动画动画协@protocol@protocol--(void)setAnimations:(NSDictionary-(id)animationForKey:(NSString*)key;修改视图属性产self.myView.animator.frame=自定义属性添加@interface@interfaceCustomView:NSView@property(nonatomic,strong){_lineColor=[NSColor}[_lineColorset];}-(void)setLineColor:(NSColor*)lineColor}修改defaultAnimationForKey方法,给自定义属性lineColor配置缺省{if([keyisEqualToString:@"lineColor"]){return[CABasicAnimationanimation];}}修改lineColor属性产生动self.myView.animator.lineColor=[NSColor修改视图的animations中了属性关联的动画,修改属性时,优先从这个字典获取属性对应的动画CAKeyframeAnimationCAKeyframeAnimation*kfa=[CAKeyframeAnimationkfa.values=@[[NSColorgreen],[NSColorredColor],[NSColoryellowColor]];view.animations=@{@"lineColor":kfa};view.animator.lineColor=[NSColor通过NSmatCtext动画上下文对象可以对动画的时长时间函数是否允许隐式动画等做全局控制。;;@propertyNSTimeInterval@property(nullable,strong)CAMediaTimingFunction*timingFunction;@property(nullable,copy)void(^completionHandler)(void);@propertyBOOLallowsImplicitAnimation;链式动画:多个动画依次 .animator.frame=}completionHandler:^{[NSAnimationContextrunAnimationGroup:^(NSAnimationself.view2.animator.frame=控制修改NSAnimationonxt的allwmlicitimaion为YS后则直接修改视图的属性就会产生动画仅支持frame,frameSize,frameOrigin3个属性;的属性动画需要layer-backed的视图,即视通过的animator修改frame执行动view.animator.frameview.animator.frame=可以简化为直接修改frame属view.frame=toValue;的属性,通过修改层的背景色产生//允许使用层self.myView.wantsLayerYES;AutoLayout增加Aoaot约束后,通过在NSAnimationCoxt的runAnimationBlock方法中执行视图或窗口的更新方法实现隐式动画。[[self.view*context){context.allowsImplicitAnimation=YES;[self.viewlayoutSubtreeIfNeeded];/*/*OR[windowAppKitAnimationVSCoreAppKit动动画做为视图的属性,运行在主线程;drawRect绘制周期修改视图的属性Core动画作为CALayer的属性,运行在线程;只修改渲染层的属性下面是视图size变化时动画过程,CoreAnimation只有在开始的t1和最后的t4时刻工作在主线程,其他时刻均在线程运行;动画编程示关键帧动画分为基于关键帧数据和基于路径的两种形式基于文本输入框,用户输入出错后,使用关键帧动画实现左右匀速晃动的动画CAKeyframeAnimationCAKeyframeAnimation*animation=[CAKeyframeAnimationanimationWithKeyPath:animation.additive=YES;animation.values=@[@(-15),@(15),@(-10),@(10),@(-8),@(8),@(-6),@(6),@(-4)animation.duration=1;[self.userNameTextField.layeraddAnimation:animation基于实现一个层沿着圆形轨道旋转的动画首先定义一个圆形图层,这个圆形是通过一个CSaeLyr层做为mk来实现。定义需要旋转的图层,添加关键帧动画,关键帧的ath定义为一个圆形,旋转模式为rtatioMoe自动。NSViewNSView*view=[self.windowcontentView];CALayer*rootLayer=view.layer;CAShapeLayer*circleShapeLayer=[CAShapeLayerlayer];CGMutablePathRefshapePath=CGPathCreateMutable();CGPathAddEllipseInRect(shapePath,nil,CGRectMake(0,0,160,160));circleShapeLayer.path=shapePath;//CALayer*circleLayer=[CALayerlayer];circleLayer.frame=CGRectMake(60,60,160,160);circleLayer.backgroundColor=[NSColorpurpleColor].CGColor;circleLayer.mask=circleShapeLayer;circleLayer.masksToBounds=YES;[rootLayer//CALayer*colorLayer=[CALayerlayer];colorLayer.frame=CGRectMake(-10,-10,20,20);colorLayer.backgroundColor=[NSColorgreenColor].CGColor;[rootLayeraddSublayer:colorLayer];//CAKeyframeAnimation*animation1=[CAKeyframeAnimationanimation]; =@"position"; =CGPathCreateWit animation1.rotationMode=kCAAnimationRotateAuto;animation1.repeatCount=100000; =YES; =2.0;animation1.calculationMode=kCAAnimationPaced;将多个动画组一组来同时运行CALayer*layer=[CALayerlayer.frame=CGRectMake(10,10,100,100);[rootLayeraddSublayer:layer];CABasicAnimation*animation1=[CABasicAnimationanimation];animation1.keyPath=@"borderWidth";animation1.duration=4.0;CABasicAnimation*animation2=[CABasicAnimationanimation];animation2.keyPath=@"backgroundColor";animation2.toValue=(bridgeid)[NSColorCAAnimationGroup*groupAnimation=[CAAnimationGroupanimation];groupAnimation.animations=@[animation1,animation2];groupAnimation.duration=4.0;// pletion=//保持动画完成后的帧状态[layeraddAnimation:animation1forKey:nil];层的内容发生变化或视图的隐藏/显示,这些场景变化时可用使用ransition产生一种过渡动画,可实现推入、移动、淡入淡出动画效果;另外OSX可以使用CFler自定义动画变化效果。图象轮播组件中magVe的图象的LaerCratn转场动画来实现图象切换的动画效果。-(-(void)transitionAnimationCATransition*transition=[CATransitionanimation];transition.startProgress=0.5;transition.endProgress=1.0;transition.type=kCATransitionPush;transition.duration=}{[selftransitionAnimation];}动画性减少在SX中的视图设置了wantayer=YS后所有子视图都有了ayer层,如果图层较多会带来了性能问题:每个层有自己的图像区,的层产生了额外的内存开多个层图象的开隐藏的图层也会产生的代在设置了视图的wantae=YS后,通过设置视图的canDrawSuviewsInoaer=YS,这样每个子视图就不会使用aer层。如果某个子视图需要使用层,可以单独自己设置允许使用层。尽可能避免操作@propertyCGFloatcornerRadius;@property(retain)CALayer*mask;@property(copy)NSArray*filters;@property(copy)NSArray尽可能设置视图的非透明属性使用Updaayers优化绘传统的视图绘制是基于CPU的drawRect:方式,如果视图的wantsUpdaayer方法返回YES,就不在调用drawRect:方法,而执行updaayer方法,在这个方法中直接修改层的内容来实现视图 {return} ayerself.layer.borderColor=NSColor.redColor.CGColor;}}系统专有CLaer做为通用的层对象位置大小旋转等基本的动画支持。提供了很多专门的Layr。使用硬件加速实现一个渐变层,比CoreGraphics中使用NSGradient性能高。startPoint和=[CAGradientLayer =CGRectMake(0,0,200,gradientLayer.colors=@[(id)[NSColor(id)[NSColorredColor].CGColor,(id)[NSColorcyanColor].CGColor,(id)[NSColorblueColor].CGColor];gradientLayer.startPoint=CGPointMake(0,0);gradientLayer.endPoint=CGPointMake(1,1);使用Path定义的几何图形或者任意的曲线的矢量图,做为CAShapeLayer的Path,实GPU加速绘制除了基本的矢量图绘制外,CAShapeLayer还可以实现图形的动画绘制CSaeLyer不能对区域填充实现动画。keStart了起点点ke定义了结束点(值的范围是按百分比定义的都是到之间的浮点数ke值要大于kekCr定义了画笔的颜色。CSaeLayerkeStrt到ke之间绘制Pat路径时产生动画。直线段绘制实现进度条动画的一个例子定义了CAShapeLayer层对象和直线段path,设置strokeStart和strokeEnd初始值。timer每隔1秒修改路径的strokeEnd值,产生隐式动画-{[superCAShapeLayer*shapeLayer=[CAShapeLayerlayer]; =CGRectMake(0,0,200,CGMutablePathRefpath=CGPathCreateMutable();CGPathMoveToPoint(path,NULL,0,20);CGPathAddLineToPoint(path,NULL,200,shapeLayer.path=path;shapeLayer.strokeEnd=shapeLayer.strokeColor=[NSColorgreenColor].CGColor;[self.layerView.layeraddSublayer:shapeLayer];self.timer=[NSTimerscheduledTimerWithTimeInterval:1 :selfselector[[NSRunLoopcurrentRunLoop]addTimer:self.timer }{if(self.shapeLayer.strokeEnd<1.0){self.shapeLayer.strokeEnd+=0.1;}}}方便处理文本的层,支持NSString或NSAttributedString的格式文本CATextLayerCATextLayer*textLayer=[[CATextLayeralloc]init];[textLayersetFontSize:14.0];[textLayersetContentsScale:[[NSScreenmainScreen]backingScaleFactor]];[textLayersetFrame:CGRectMake(0,0,80,50)];[textLayersetString:@"textstring"];[textLayersetBackgroundColor:[[NSColorclearColor]CGColor]];[textLayersetForegroundColor:[[NSColorblackColor]CGColor]][self.leftView.layeraddSublayer:textLayer];一种分片显示内容的层,可以理解为把层划分为小的网格,每个格子内容单独加载显示显示大的图像或大的视图。定义一个子类化视图TileView,在makeBackingLayer方法中定义TileViewCATiledLayer类型在层方法raLaye:Ctet:中计算个格子的行r和列c分别处理。这个例子中是简单随机生成Cr绘制一个矩形。#import#import<Cocoa/Cocoa.h>@interfaceTileView:NSView#import@implementationTileView-(CALayer*)makeBackingLayerCATiledLayer*tileLayer=[CATiledLayerlayer];tileLayer.tileSize=CGSizeMake(60,60);tileLayer.delegate=self;return}{CGRectbounds=NSIntegerrow=floor(bounds.origin.x/layer.tileSize.width);NSIntegercol=floor(bounds.origin.y/layer.tileSize.height);}}CGContextFillRect(ctx,bounds);NSLog(@"row=%ldcol=%ld将TileView做为scrollView的文档视TileViewTileView*layerView=[[TileViewalloc]initWithFrame:CGRectMake(0,0,360,self.scrollView.autohidesScrollers=YES; View=实现子层的多份,包括子层的动画效果CAReplicatorLayerCAReplicatorLayer*copiedLayer=[CAReplicatorLayerlayer];[view.layeraddSublayer:copiedLayer]; 时延时间隔copiedLayer.instanceDelay=//颜色的RGB =-copiedLayer.instanceBlueOffset=- 的层之间X,Y,ZcopiedLayer.instanceTransform=CATransform3DMakeTranslation(20,0,0)CALayer*layer=[CALayerlayer.frame=CGRectMake(10.0f,10.0f,10.0f,100.0f);layer.backgroundColor=[NSColorCABasicAnimation*animation=[CABasicAnimation//位置Y坐标 =@(layer.position.y-arc4random()%100); =1.0f; =true; =层[copiedLayer粒子系统包括粒子发射源控制系统CAEmitterLayer和粒子模型CAEmitterCellCmtteLyer发射源申明全局的控制参数包括发射源的位置emttrPtemtterSz大小rtate每秒产生率reerMe渲染模式emtteSae发射源形状初速度vecy。CAEmitterCell粒子模型,主要包括粒子内容contents(CGImageRef类型),粒子的颜色color,速度velocity,缩放scale,方向旋转spin,生命周期时间lifetime,xyz三个方向的加速度AccelerationCALayer*rootLayer=[myView//粒子源系统定义CAEmitterLayer*snowEmitter=[CAEmitterLayersnowEmitter.drawsAsynchronouslyYES;[snowEmittersetName:@"snowEmitter"];snowEmitter.zPosition=10.00f;snowEmitter.emitterPosition=CGPointMake(300.00f,300.00f);snowEmitter.renderMode=kCAEmitterLayerBackToFront;snowEmitter.emitterShape=kCAEmitterLayerCircle;snowEmitter.emitterZPosition=-43.00f;snowEmitter.emitterSize=CGSizeMake(160,160);snowEmitter.velocity=20.57f;snowEmitter.birthRate=10;//第一个粒子模型定义CAEmitterCell*snowFlakesCell=[CAEmitterCellemitterCell];[snowFlakesCellsetName:@"snowFlakesCell"];//粒子内容图象,必须是CGImageRefsnowFlakesCell.contents=(bridgeid)[[NSImageimageNamed:@"Ball_red.png"CGColorRefcolorRefSnowflakescell=CGColorCreateGenericRGB(0.77f,0.65f,0snowFlakesCell.color=colorRefSnowflakescell;snowFlakesCell.redRange=0.90f;snowFlakesCell.greenRange=0.80f;snowFlakesCell.blueRange=0.70f;snowFlakesCell.alphaRange=0.80f;snowFlakesCell.redSpeed=0.92f;snowFlakesCell.greenSpeed=0.84f;snowFlakesCell.blueSpeed=0.74f;snowFlakesCell.alphaSpeed=0.55f;snowFlakesCell.scale=0.72f;snowFlakesCell.spin=0.38f;snowFlakesCell.spinRange=0;snowFlakesCell
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年郑州市郑盐盐业集团有限公司招聘一批工作人员考试备考题库及答案解析
- 2026河南商丘市直机关事业单位公益岗位招聘13人笔试备考题库及答案解析
- 2026黑龙江哈尔滨工业大学机电工程学院机械设计系招聘笔试备考题库及答案解析
- 2026湖北武汉人才服务发展有限公司招聘派往武汉市国企工作笔试备考题库及答案解析
- 2026年内蒙古科技职业学院单招职业适应性测试题库有答案详细解析
- 2026青海湟水文化产业有限公司招聘6名笔试模拟试题及答案解析
- 2026宁夏银川市永宁县卫生健康系统第一期专业技术人员自主招聘59人笔试备考试题及答案解析
- 2026云南临沧永德县人力资源和社会保障局招聘就业见习人员30人考试备考题库及答案解析
- 2026浙江事业单位统考玉环市招聘59人笔试模拟试题及答案解析
- 贵州省重点名校2026届初三第一次教学质量检测试题语文试题试卷含解析
- 钢丝pe施工方案(3篇)
- 2026年医疗AI辅助手术报告
- 2026年六安职业技术学院单招职业适应性考试题库含答案详解(考试直接用)
- 2026年《禁毒法》知识测试题及答案(全优)
- 骨科院感防控管理
- 企业人力资源管理体系规划方案书
- 2025年安徽专升本英语历年真题及答案
- 【544】人际心理治疗(IPT)
- 2026年枣庄滕州市事业单位公开招聘初级综合类岗位人员41人考试参考试题及答案解析
- 上海市2026届春季高考“井水与河水”语文作文解析与范文欣赏
- 2025年高考地理30道综合题真题训练
评论
0/150
提交评论