zoukankan      html  css  js  c++  java
  • Core Animation Programming Guide

    Setting Up Layer Objects

    Core Animation 的使用离不开 Layer 对象。Layer 管理着 app 可见的内容,为视觉内容和现实效果提供修改的选项。尽管在 iOS 中默认启用了 layer 功能,然而在 OS X 中要想获得 layer 带来的性能提示就只能手动地启用它。一旦 layer 被启用,就可以尽情的通过配置和操作 app 的 layer 来多的想要的效果了。

    Enabling Core Animation Support in Your App

    在 iOS 的 app 当中。Core Animation 总是处于启用状态,每一个视图都是构建在 layer 之上。而 OS X 就需要按照以下步骤完成 COre Animation 的启用:

    • 添加 QuartzCore 框架的引用。(iOS app 只有在明确需要使用 Core Animation 接口时才引用。)
    • 为一个或多个 NSView 对象启用支持,按如下步骤:
      • 在 nib 文件中,使用 View Effects inspector 为你你的视图启用 layer 支持。inspector 会显示复选框来选择视图和它的子视图。建议你尽可能的在内容视图中启用。
      • 代码创建的视图调用 setWantsLayer: 方法并传一个 YES的参数,就可以启用了。

    在前面的 layer 启用方法中,创建的都是 layer-backed 视图。在 layer-backed 视图中,系统会负责创建下面的 layer 对象并监管 layer 对象的更新。在 OS X 中,你可以通过创建 layer-hosting 视图手动创建和管理底层的 layer 对象(在 iOS 中无法创建 layer-hosting 视图)。关于创建 layer-hosting 视图,详见 Layer Hosting Lets You Change the Layer Object in OS X

    Changing the Layer Object Associated with a View

    Layer-backed 视图默认创建一个 CALayer 类的实例,而且多数时候你并不需要其他类型的 layer 对象。Core Animation 提供了不同的 layer 类型,每个类型都提供你可能需要的具体的功能,正确地选择一个不同的 layer 类型可以用简单的方式帮你提升性能,例如,CATiledLayer 类可以用高效的方式优化大图片的现实。

    Changing the Layer Class Used by UIView

    你可以在 iOS 视图中重写 layerClass 方法改变默认的 layer 类型。大部分 iOS 视图创建 CALayer 对象存储它的内容。对于你的视图这个默认选择是有益的,你不需要改变它。但是在特定的情况下你可以找到更合适的 layer 类型。例如,你可能在以下情况中想改变 layer 类型:

    • 你的视图使用 OpenGL ES 绘制内容,可以用 CAEAGLLayer 对象。
    • 有更专门的 layer 类型更好的性能。
    • 你想利用一些特定的 Core Animation layer 类型,比如 粒子发射 或 画面重现。

    改变视图的 layer 类型很简单,代码 2-1 是一个实例。你需要做的只是重写 layerClass 方法,返回你想替换的类型。在现实之前,视图会调用这个方法,使用返回的类型创建一个新的 layer 对象,一旦创建,就不能在更改。

    代码 2-1 Specifying the layer class of an iOS view

    + (Class) layerClass{
    	return [CAEAGLLayer class];
    }
    

    关于更多的 layer 类型以及使用,详见 Different Layer Classes Provide Specialized Behaviors

    Changing the Layer Class Used By NSView

    在 NSView 对象中可以重写 makeBackingLayer 方法实现默认 layer 类型的变更。在这个方法的实现里,创建并返回一个你想为视图定义的 layer 对象。你可能会在诸如使用滚动和磁铁 layer 的情况下重写。

    更多 layer 类型及使用,详见 Different Layer Classes Provide Specialized Behaviors

    Layer Hosting Lets You Change the Layer Object in OS X

    一个 layer-hosting 视图是一个 NSView 对象,下面的 layer 对象需要你自己手动创建和管理。也许在想控制视图相关类型的情况下你才会使用 layer hosting。例如,你创建一个 layer-hosting 视图以便用一个自定义的 layer 类型来替换默认的 CALayer 类型。也可能会在用单个视图管理不相关 layer 组成层次。

    当你调用视图的 setLayer: 方法并提供一个 layer 对象时,AppKit 为这个 layer 提供了方便的操作。通常 AppKit 更新视图的 layer 对象,但是在 layer-hosting 这种情况下它并不为大多数的属性提供更新。

    代码 2-2 展示了怎么创建一个 layer-hosting 视图和自定义的 layer 对象,并在屏幕显示前关联两者。另外为了设置layer 对象,你仍需调用 setWantsLayer: 方法以便让视图知道它应该使用 layer:

    代码 2-2 Creating a layer-hosting view

    // Create myView...
    
    [myView setWantsLayer:YES];
    CATiledLayer *hostedLayer = [CaTiledLayer layer];
    
    [myView setLayer:hostedLayer];
    
    // Add myView to a view hierachy.
    

    如果你选择了 host layer,你必须设置 contentScale 属性以便可以显示高的分辨率。关于高分辨率的内容和缩放,详见 Working with High-Resolution Images

    Different Layer Classes Provide Specialized Behaviors

    Core Animation 定义了许多标准的 layer 类型,每种类型都有特定的用处。CALayer 是这些 layer 对象的根类,它定义了所有 layer 对象都应该支持的行为,是 layer-backed 视图的默认类型。在表 2-1 中展示了可用的 layer 类型:

    表 2-1 CALayer subclasses and their uses

    Class Usage
    CAEmitterLayer 用来实现基于 Core Animation 的例子发射系统。发射 layer 对象控制 粒子的原点和生成。
    CAGradientLayer 用来绘制被彩色的坡度填充的 layer(具有圆角边界)。
    CAEAGLLayer/CAOpenGLLayer 用来在使用 OpenGL ES(iOS) 或 OpenGL(OS X)时存储需要被绘制的上下文。
    CAPreplicatorLayer 当你想自动地复制一个或更多的子 layer 时,此对象可以为你复制,并让你改变复制的属性。
    CAScrollLayer 用来管理由多个子 layer 构成的大的滚动区域。
    CAShapeLayer 可以绘制贝塞尔曲线,可以很方便地绘制基于路径的曲线图形。但是,曲线结果的渲染是在主线程上完成和缓存的。
    CATextLayer 用来渲染平面或带有属性的文本字符串。
    CATiledLayer 用来管理可以单独渲染或一片片渲染的大图片。
    CATransformLayer 用来渲染真是的 3D layer 层次,而不是像其他 layer 类型一样的平面层次。
    QCCompositionLayer 用来渲染一个 Quartz COmposer 构造。(仅用于 OS X)


    ### Providing a Layer's Contents

    layer 其实是管理你 app 内容的数据对象。一个 layer 由一张位图构成,包含了你想显示的可视数据。你可以用一下三种方式为位图提供内容:

    • 直接给 layer 对象的 contents 属性赋值为图像对象。(最好不要这样用)
    • 直接赋给 layer 对象一个委托对象来绘制 layer 的内容。(这是最好的选择,可以进行一系列的改变,并且能提供额外的对象,比如视图。)
    • 定义一个 layer 的子类,重写一个它的绘制方法来提供自定义的layer 内容。(如果你不得不创建一个自定义 layer 子类或者你想改变 layer 默认的一些绘制行为。)

    Using an Image for the Layer's Content

    因为 layer 只是管理位图的容器,你可以直接赋给 layer 的 contents 属性一张图片。直接赋值一张图片很简单而且让你能够在屏幕上完全展示你想想要的内容。layer 会直接使用你提供的图片而不是创建一个图片的拷贝。这种行为可以在多个使用同一张图片的情况下节约内存占用。

    你赋值的图片类型必须是 CGImageRef 类型。(OS X v10.6 及之后可以直接使用 NSImage 对象。)同时你也需要注意图片的分辨路问题,在 retina 显示的设备上,可能还需要你适配图片的 contentsScale 属性。具体的layer高分辨率内容详见 Working with High-Resolution Images

    Using a Delegate to Provide the Layer's Content

    如果你的 layer 内容是动态变化,可以使用委托对象根据需要提供内容的更新。在显示时,layer 调用委托方法以提供需要的内容:

    • 如果你的委托实现了 displayLayer: 方法,就可以负责创建一张位图并赋值给 layer 的 contents 属性。
    • 如果你的委托实现了 drawLayer:inContext: 方法,Core Animation 创建一张位图,并创建一个绘制到此位图中的图形上下文,然后调用你的委托方法填充位图。你的委托方法只需要在提供的图形上下文中绘制。

    委托对象必须实现 displayLayer: 或 drawLayer:inContext: 方法,如果这两个方法都被实现了,layer 只调用 displayLayer: 方法。

    当你的 app 想加载或者创建显示的位图时,重写 displayLayer: 方法是最合适的。代码 2-3 展示了一个实现 displayLayer: 委托方法的示例。在这个例子中,委托使用一个帮助对象来加载和显示需要的图片。委托方法根据内部的状态选择显示哪张图片,在这个例子中状态是自定义的属性 displayYesImage。

    代码 2-3 Setting the layer contents directly

    - (void)displayLayer:(CALayer *)theLayer {
    	// Check the value of some state property
    	
    	if (self.displayYesImage) {
    		
    		// Display the Yes image
    				
    		theLayer.contents = [someHelperObject loadStateYesImage];
    		
    	}
    	
    	else {
    		// Display the No image
    		
    		theLayer.contents = [someHelperObject loadStateNoImage];
    	}
    }
    
    

    如果你没有预生成的图片,或者不能够创建位图,你的委托可以使用 drawLayer:inContext: 方法动态绘制内容。代码 2-4 展示了实现 drawLayer:inContext: 方法的示例。在这个例子中,用固定的款多和当前渲染的颜色绘制了简单的弧形路径。

    代码 2-4 Drawing the contents of a layer

    - (void)drawLayer:(CALayer *)theLayer inContext:(CGContextRef)theContext {
    	
    	CGMutablePathRef thePath = CGPathCreateMutable();
    	
    	
    	CGPathMoveToPoint(thePath, NULL, 15.0f, 15.f);
    	
    	CGPathAddCurveToPoint(thePath,
    							NULL,
    							15.f, 250.0f,
    							295.0f, 250.0f,
    							295.0f, 15.0f);
    							
    							
    	CGContextBeginPath(theContext);
    	
    	CGContextAddPath(theContext, thePath);
    	
    	
    	CGContextSetLineWidth(theContext, 5);
    	
    	CGContextStrokePath(theContext);
    	
    	
    	// Release the path
    	
    	CFRelease(thePath);
    }
    
    
    

    对于自定义内容的 layer-backed 视图,你应该继续重写视图的方法绘制自己的内容。layer-backed 视图自动实现委托以及委托方法,你不应该更改它的配置,用 drawRect: 方法绘制自己的内容。

    在 OS X v10.8 及之后,另一个绘制的方法是重写你的视图的 wantsUpdateLayer 和 updateLayer 方法提供位图。重写 wantsUpdateLayer 并返回 YES 会使 NSView 类型使用另一种渲染途径。视图会调用你的 upateLayer 方法代替调用 drawRect:,在方法体中要直接为 layer 的contents 属性赋值一张位图。这是 AppKit 架构期望你直接设置视图 layer 内容的地方。

    Providing Layer Content Through Subclassing

    如果你自定义了一个 layer 类,你可以重写绘制方法定制自己的内容。layer 对象生成独有的内容有点特殊,但是它能管理显示的内容。例如,CATiledLayer 把一张大图分割成一片片来管理,也可以单独显示一片。当 layer 收到需要显示哪一片的信息时它才会直接管理绘制行为。

    在继承类中,你可以用以下两种技术绘制自己的 layer 内容:

    • 重写 layer 的 display 方法并用它直接设置 layer 的 contents 属性。
    • 重写 layer 的 drawInContext: 方法,在里面绘制图形上下文。

    重写哪个方法取决于你想怎么控制绘制过程。display 方法是更新 layer 内容的主要入口点,因此重写此方法可以完全控制内容的显示,同时也意味着你需要在此方法中负责创建 CGImageRef 类型的 contents 属性值。如果你只想绘制内容或者用 layer 管理绘制操作,你可以重写 drawInContext: 方法替代重写 display,在此方法中 layer 为你创建后台存储。

    Tweaking the Content You Provide

    当你为 layer 的 contents 属性赋值一张图片时,layer 的 contentsGravity 属性决定了如何操作这张图片适配当前的界面。如果图片比当前界面大或者小,默认情况下 layer 对象会放大/缩小图片做可用空间的适配。如果 layer 界面的尺寸比和图片的不同会导致图片扭曲失真。你可以用 contentsGravity 属性确保你的内容以最合适的方式展现。

    contentsGravity 属性值分以下两类:

    • position-based gravity 常量允许你不缩放图片把图片钉在 layer 界面的边缘或者角落里。
    • scaling-based gravity 常量允许你拉伸图片,有些常量能保护图片的宽高比,有些则不能。

    图 2-1 展示了 position-based gravity 设置是如何影响你的图片的。用 kCAGravityCenter 常量,每一个都可以把图片固定在 layer 的界面边缘或者边角内。kCAGravityCenter 常量可以居中放置图片。这些常量都不会导致图片缩放失真,因此图片总是以原始尺寸呈现。若果图片的尺寸大于 layer 的界面,则会导致图片的超出部分被剪去,如果图片较小,图片就不能遮盖住 layer 的背景色。

    图 2-1 Position-based gravity constants for layers

    图 2-2 展示了 scaling-based gravity 常量如何影响图片。如果图片不适配 layer 界面这些常量会缩放图片。这些模式的不同之处是如何缩放时处理图片的尺寸比,其中有些会保护尺寸比。默认情况下,layer 的 contentsGravity 属性值是 kCAGravityResize 常量,这个常量是唯一不包含图片尺寸比的。

    图 2-2 Scaling-based gravity constants for layers

    Working with High-Resolution Images

    layer 并不会根据设备的分辨率而设置自身的分辨率。layer 只简单地存储一个指向你的位图的指针并以最合适的方式显示有效的像素。如果你为 layer 的contents 属性提供一张图片,你必须设置 layer 的 contentsSale 属性告诉 Core Animation 这张图片的分辨率,此属性的默认值是 1.0,如果在 retina 屏幕上显示就需要设置为 2.0。

    只有在直接为 layer 赋值一张位图时才会更改 contentsScale 属性。在 UIKit 和 AppKit 中一个 layer-backed 视图会自动根据屏幕的分辨路和视图管理的内容设置 scale factor 为合适的值。例如,如果你在 OS X 中设置 layer 的contents 属性为一张 NSImage 对象,AppKit 会查找这张图片是否存在普通和高分辨率,如果有都存在,AppKit 会使用正确的一张为当前分辨率设置 contentsScale 属性。

    在 OS X 中,position-based gravity 常量影响被赋值给 layer 的 NSImage 对象的图片描述,因为这些常量不会导致图片被缩放,Core Animation 依赖 contentsScale 属性用合适的像素密度显示图片。

    在 OS X 中,layer 的委托对象可以实现 layer:shouldInheritContentsScale:fromWindow: 方法,用它来响应缩放相关改变。因为窗口在标准和高分辨率的屏幕间移动,无论给定窗口的分辨率何时改变, AppKit 自动调用此方法。如果委托支持 layer 图片分辨率的更改,你实现的这个方法应该返回 YES 值。然后这个方法应该更新 layer 的 contents 以响应新的分辨率。

    Adjusting a Layer's Visual Style and Appearance

    layer 对象已经内置了一些视觉修饰,如 border 和 背景色,你可以用来修饰 layer 的主要内容。因为这些修饰不需要你坐任何渲染,有时可以把 layer 作为单独的实体使用。你所要做的只是设置一下 layer 的属性,剩下的渲染和动画都是 layer 处理。layer 其他的视觉装饰的效果说明,详见 Layer Style Property Animations

    Layers Have Their Own Background and Border

    一个 layer 在他基于图片的内容中可以显示填充的背景色和边框加粗。背景色的渲染是在 layer 的图片内容之后,边框加粗则是在上面,如图 2-3 。如果 layer 包含子 layer,也会显示在边框之下。因为背景色在图片之下,要想显示只有设置图片的透明度。

    图 2-3 Adding a border and background to a layer

    代码 2-5 展示了怎么设置 layer 的背景色和边框。这些属性都是可以形成动画的。

    myLayer.backgroundColor = [NSColor greenColor].CGColor;
    myLayer.borderColor = [NSColor blackColor].CGColor;
    myLayer.borderWidth = 3.0;
    
    

    注意:你可以使用任意类型的颜色设置 layer 的背景色,包括透明色或者模型图片。当使用模型图片时,Core Graphics 处理模型图片的渲染,使用的是标准的坐标系统,ios 系统的坐标系统不同于 OS X。因此,在 iOS 中图片的渲染默认是自上而下的,除非你翻转坐标。


    如果你要设置 layer 的背景色为不透明色,请考虑设置 layer 的opaque 属性为 YES。这样可以在屏幕上构筑 layer 和消除 layer 的后台存储以管理管道的 alpha 值时提高性能。尽管如此,如果 layer 同时又一个非零的圆角就不用设置为不透明了。

    Layers Support a Corner Radius

    你可以为 layer 添加圆角效果。一个圆角就是 layer 的四个角呈现想通的弧度,如图 2-4 。如果不设置 layer 的属性 masksToBounds 为 YES ,圆角就不会影响 layer cotents 属性的图形内容。然而,圆角总是影响 layer 的背景色和边框的渲染。

    图 2-4 A corner radius on a layer

    为 layer 的 cornerRadius 指定一个值可以设定其圆角。你设定的半径值的单位是 point,应用于四个边角。

    Layers Support Built-In Shadows

    CALayer 类型有许多属性可以配置阴影效果。加载layer 上的阴影效果可以使其想浮动在内容之上。在你的 app 中你回发现有时这个装饰效果很有用。通过 layer,你可以控制阴影的颜色,放置相关的 layer 属性如 content,opacity 和 shape。

    layer 的阴影不透明度默认是 0,使阴影不显示。改变不疼名度为非零值可以让 Core Animation 绘制出阴影。因为阴影默认是直接放在layer 下面的,在你能看到它之前需要先改变阴影的偏离值。有一点需要注意,你为阴影指定的偏离值使用的是 layer 的本地坐标系统,在 iOS 和 OS X 中是不同的。图 2-5 展示了一个偏向于右下方的 layer 阴影。在 iOS中,这需要指定 y 轴值为正数,而 OS X 中就需要负数了。

    图 2-5 Appling a shadow to a layer

    当为 layer 添加阴影时,阴影成为 layer 的一部分但实际却偏离出layer 的边界框。如果你为 layer 启用 masksToBounds 属性,会产生阴影效果被从边缘剪去的结果。如果你的 layer 包含透明的内容,会导致layer 下面的阴影正常显示,但是超出 layer 的则不显示的奇怪效果。如果你既想要有阴影又想使用边界遮盖,可以使用两个 layer 替换一个。把内容放在遮掩边界的 layer 中,然后把这个 layer 嵌入到另一个,另个一 layer 可以实现阴影效果。

    关于怎么在 layer 中应用阴影效果,详见 Shadow Properties.

    Filters Add Visual Effects to OS X Views

    在 OS X 的 app 中,你可以直接为你的 layer 内容应用 Core Image 滤镜。你可以模糊或者锐化 layer 内容,改变颜色,扭曲内容,或者变现其他类型的操作。例如,一个图片处理程序可以非破坏性地使用这些滤镜修改图片,视频编辑程序可以用他们实现不同的过度类型效果。因为这些滤镜是通过硬件应用在 layer 的内容内,渲染过程很快很平滑。


    注意:你不能在 iOS 中为 layer 对象添加滤镜。


    对于一个给定的 layer,你可以在layer 的前景和北京内容上应用滤镜。前景内容包含 layer 自身的所有,如 contents 属性的图片,它的背景色,边界,以及子 layer 的内容。背景内容是 layer 下面的内容,但不是 layer 的实际部分。大多数 layer 的背景内容是父 layer 的即时内容,被 layer 完全或者部分低遮掩。例如,当你想让用户关注 layer 的前景内容时可以设置背景 模糊滤镜。

    你可以按照以下的方法为 layer 添加 CIFilter 对象实现滤镜:

    • filters 属性包含一个只应用于 layer 前景内容的滤镜。
    • backgroundFilters 属性包含仅用于 layer 背景内容的滤镜。
    • compositingFilter 属性定义了 layer 的前景和北京内容如何复合在一起。

    为 layer 添加滤镜,首先需要创建和定位一个 CIFilter 对象,然后再添加进 layer 前配置它。CIFilter 类包含几个可以定位到可用 Core Image 滤镜的类方法,比如 filterWithName: 方法。创建滤镜只是第一步。许多滤镜有定义怎么修改图片的参数。例如,一个模糊滤镜需要输入半径参数以便决定要应用的模糊数量。作为滤镜配置进程的一部分你应当提供这些参数值。有一个参数不需要你明确,就是 layer 自身提供的图片。

    在添加滤镜到 layer 前,最好先配置好滤镜的相关参数。之所以这样是因为一旦添加进去后就不能对 CIFilter 对象做出修改。但是你可以在加入滤镜之后通过 layer 的setValue:forKeyPath: 方法改变滤镜的值。

    代码 2-6 展示了如何为 layer 对象创建和应用一个捏放变形的滤镜。这个滤镜捏放的原像素是 layer 内部的,把这些像素尽可能的想中心点靠拢。注意,你不需要明确指出输入的图片,因为 layer 的图片被自动使用。

    图 2-6 Applying a filter to a layer


    CIFilter* aFilter = [CIFilter filterWithName:@"CIPinchDistortion"];
    [aFilter setValue:[NSNumber numberWithFloat:500.0] forKey:@"inputRadius"];
    [aFilter setValue:[NSNumber numberWithFloat:1.25] forKey:@"inputScale"];
    [aFilter setValue:[CIVector vectorWithX:25.0 Y:150.0] forKey:@"inputCenter"];

    myLater.filters = [NSArray arrayWithObject:aFilter];


    关于 Core Image 滤镜的更多信息,详见 Core Image Filter Reference

    The Layer Redraw Policy for OS X Views Affects Performance

    在 OS X 中,layer-backed 视图为什么时候决定更新 layer 的内容提供了几种不同的策略。因为本地 AppKit 绘制模型和介绍过的Core Animation 存在差异,这些策略可以使你的旧代码向 Core Animaiton 迁移更容易。你可以在每一个视图中配置这些策略确保得到最好的性能。

    每一个视图定义一个 layerContentsRedrawPolicy 方法,此方法返回视图 layer 的重绘策略。你可以通过 setLayerContentsRedrawPolicy: 方法设置策略。为了保护和传统绘制模型的兼容性, AppKit 通过 NSViewLayerContentsRedrawDuringViewResize 修改默认的重绘策略。但是,你可以修改策略为表 2-2 中的任意值。注意,推荐的重绘策略并不是默认的。

    表 2-2 Layer redraw policies for OS X views

    Policy Usage
    NSViewLayerContentsRedrawOnSetNeedsDisplay 这是推荐的方针,使用此方针可以使视图几何改变时不会自动导致视图更新 layer 内容。layer 存在的内容被拉伸和操作,以便加快几何的改变。为了能使视图重绘更新 layer 的内容,你必须明确地调用视图的 setNeedsDidsplay: 方法。

    此方针比较代表 Core Animation layer 的标准行为。然而,这并不是默认的方针而且需要明确地设定。
    NSViewLayerContentsRedrawDuringViewResize 这是默认的重绘方针。无论视图几何什么时候改变,此方针依靠重新缓存 layer 的内容维护和 传统的 AppKit 绘制的最大兼容性。在尺寸操作的过程中,你的 app 主线程会调用视图的 drawRect: 方法多次,每次结束时产生此行为。
    NSViewLayerContentsRedrawBeforeViewResize AppKit 在位图的尺寸操作和缓存前绘制 layer 的最终尺寸。重新的尺寸操作使用的是已经缓存的位图作为开始的图片,缩放它以便适应就得边框。它最终以动画的形式表现出位图的最终尺寸。这种行为在动画的开始使视图的内容表现为拉伸或失真好过于初始的表现不重要或者不知道关注。
    NSViewLayerContentsRedrawNever 使用此方针,即使你调用 setNeedsDisplay: 方法 AppKit 也不会更新 layer。对于那些内容不改变而且尺寸不怎么变化的视图此方针是最合适的。例如,你可能用于固定尺寸的内容或者背景元素。

    视图的重绘方针缓解了单独子 layer 的频繁使用,提升了绘制的性能。先前介绍的视图重绘方针,有几个会使 layer-backed 的视图绘制的频繁度高于实际需要。根据 OS X v10.6 绘制方针的介绍,强烈推荐你设置 layer-backed 视图的重绘方针,而不是大量的使用 layer 层次构建。

    Adding Custom Properties to a Layer

    CAAnimation 和 CALayer 类支持通过 key-value 编码扩展自定义的属性。你可以使用这个行为为 layer 添加数据,并用自定义的 key 来检索。你甚至可以用自定义的属性关联 actions,以便那你在改变属性时产生响应的动画。

    关于如何设置自定义属性,详见 Key-Value Coding Compliant Container Classes。关于为 layer 对象添加 actions 的信息,详见 Changing a Layer's Default Behavior

    Printing the Contents of a Layer-Backed View

    在打印期间,layer 按需要重绘他们的内容为打印环境提供便利。由于 Core Animation 一般依赖缓存位图在屏幕上渲染,打印的时候会重绘这些内容。需要特别提出,如果 layer-backed 视图使用 drawRect: 方法提供 layer 的内容,Core Animation 在为了生成打印的 layer 内容的打印期间会再次调用 drawRect: 方法。

  • 相关阅读:
    Oracle基本概念
    md5密码生成工具
    tab页中不借用iframe的写法
    梅花雪树2.0和测试例子
    JS按比例缩放图片
    ASP.NET 文件下载
    删除VS2008最近打开文件或最近打开项目;重新另存项目的.sln文件
    去掉WINDOWS 2003 SERVER 开机和关机的麻烦
    分别设置母版页和内容页控件的值
    动态修改页面标题,关键字及描述等信息
  • 原文地址:https://www.cnblogs.com/1oo1/p/4238586.html
Copyright © 2011-2022 走看看