QuartzCore/QuartzCore框架
来源:互联网 发布:注册域名免费 编辑:程序博客网 时间:2024/05/22 06:38
Quartz Core图层编程
文章出处:http://blog.csdn.net/iukey
一、添加 Quartz Core 框架
要使用
二、认识图层
对 ps有所了解的人都知道图层的概念,在这里也一样。在PS中一张图片至少得有一个图层,一个或多个图层的叠加构成了一张位图。我们这里一个或多个图层的叠加的构成了UIView(或其派生类)对象。看过我关于UIView 文章的人可能会有疑问:UIView 和图层没啥区别啊?NO,还是有区别的,图层是有弹性的,你可以操纵图层,使UIView 有各种效果,比如三维效果,形变等等。
要访问一个图层,需要读取 UIview 的 layer属性。
- CALayer*
layer = self.view.layer;
有人又有疑问了,上面的代码我们只读取了一个 layer假如一个UIView 有多个图层呢? 不错 UIView 确实只有一个layer 属性,但是layer 是可以叠加的,layer可以叠加在 layer 上面,所以这个layer就相当于是一块底板,我们可以在这块地板上叠加一些透明胶片(子图层),叠加在一起之后就构成了一个组合图像。
三、图层的层次结构
图层有很多通用的方法和属性,来操作子图层和执行绘制操作。这些方法允许你将许多单个图层叠加在一起,来绘制一个组合的屏幕图像。
一个图层可以有许多个子图层。在最终绘制屏幕时,子图层可以被排列后固定在一起。这可以参考赛车游戏中的图层。游戏可能有几个图层组成:一个绘制背景、一个绘制角色、一个绘制地图显示器。你可能会为每个图层准备一个专门的UIView类,并另外用一个UIView类来整合游戏画面:
- UIView*
gameView = [[UIView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame] ]; -
UIView* backgroundView = [[UIView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]]; -
UIView* roleView= [[UIView alloc]initWithFrame:CGRectMake(0.0, 0.0, 100.0, 200.0)]; -
UIView* mapView = [[UIView alloc]initWithFrame:CGRectMake(200.0, 0.0, 100.0, 100.0)]; -
//通过CALayer 类的addSublayer 方法,你可以将3个UIView 类的图层全都与 gameView 对象链接在一起: -
CALayer* gameLayer = gameView.layer; -
[gameLayer addSublayer:backgroundView.layer]; -
[gameLayer addSublayer:roleView.layer]; -
[gameLayer addSublayer:mapView.layer];
当gameView对象显示在屏幕上的时候,3个子图层被合并在一起绘制出来。每个类单独绘制他自己的图层,但当游戏图层被显示出来的时候,3个图层就全都融合在一起了。
gameView不是唯一能够添加子图层的图层。子图层也可以添加自己的子图层,并且可以构建一个完整的图层层次结构。例如你的游戏可能会在mapView图层中再构加入一个图层,用来显示map的一部分内容,比如剩余里程数。
- UILabel*
lastDistance 0.0,= [[UILabel alloc]initWithFrame:CGRectMake( 0.0, 20.0, 20.0)]; -
[mapView.layer addSublayer:lastDistance.layer];
此外,通过设置图层的position属性,你还可以不用改变图层的大小就对其位置进行调整。这个属性接受一个CGPoint结构体,来定位图层在屏幕上的偏移位置。与frame 属性不同,position 属性指定的是图层的重点,而不是左上角:
- CGPoint
lastDistancePosition 100.0,= CGPointMake( 100.0); -
lastDistance.layer.position = lastDistancePosition;
四、布局与显示
除了添加子图层之外,CALayer类还提供了很多不同的方法,可以来插入、调整和移除子图层。
当你用 addSublayer来添加一个子图层时,他会被添加到图层层次结构的顶层,所以他会显示在现有所有子图层的最前面。用一组名为 insertSublayer的替代方法,你可以将新视图插入现有的图层之间。
用atIndex参数,可以将一个图层插入到指定的下标位置:
- [gamelayer
insertSublayer:mapView.layer 1];atIndex:
- [
gamelayer insertSublayer:mapView.layer below:backgroundView.layer]; - [
gamelayer insertSublayer:mapView.layer above:roleView.layer];
- [
mapView.layer removeFromSuperlayer];
- [
gamelayer replaceSublayer:backgroundView.layer with:newBackgroundView.layer ];
- -
( void)Togglemap{ -
mapView.layer.hidden = (mapView.layer.hidden == NO)?YES:NO; - }
在更新一个图层时,变化不是立刻被绘制在屏幕上的。这样你就可以偷偷地对图层做很多写操作而不会被展示给用户,直到所有的操作全部结束为止。当图层准备好可以进行重画时,就调用图层的setNeedsDisplay
- [
gamelayer setNeedsDisplsy ];
- CGRect
mapViewFrame 150.0,150,75.0,75.0);=CGRectMake( - [
gameLayer setNeedsDisplayInRect:mapViewFrame ];
- CGContextRef
myCGContext = UIGraphicsGetCurrentCont ext(); - [
gamelayer renderInContext:myCGContext ];
六、变换
要为图层加上一个三维变换或者仿射变换,可以分别设置图层的transform 或 affineTransform 属性。
- roleview.layer.transform
= 1.0,-1.0,1.0);CATransform3DMakeScale( - - CGAffineTransform
transform = CGAffineTransformMakeRot ation(45.0); - backgroundView.layer.affineTransform
=transform ;
Quartz Core的能力远远不止一个简单的画板式图层。他可以将一个二维物体变换为一个令人瞠目结舌的三维纹理,用于创建NB的转场动画。
我之前写过一篇介绍转场动画的文章,那是一种在不同UIView 对象之间进行过度的手段。你可以直接将转场动画用于图层或子图层。动画可以作为 CAtransition对象创建出来。
图层转场增强了现有的 CATransition类,为其提供了一种方法,能用Quartz Core 的动画引擎来添加动画。这令开发者可以利用QuartzCore提供的三维功能,而不必对代码做大的改动。当图层被动画使,一个 CATransition 或CAAnimation对象会被附加在图层上。然后图层会调用QuartzCore,分支出一个新线程,负责动画的全部图形处理工作。开发者秩序加入期望的动画,就可以提升一个现有图层的功能。用下面的例子代码,可以创建一个转场:
- CATransition*
animation = [[CATransition alloc]init]; -
animation.duration =1.0; -
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEa seIn]; -
animation.type = kCATransitionPush; -
animation.subtype = kCATransitionFromRight;
警告:到目前为止,恶心的的苹果允许用户创建的转场类型仍然极其有限。Quartz Core框架内部还支持相当多的其他转场效果,例如自然翻页和缩放转场等,但是受到限制,只能有苹果自己的应用程序使用。(恶心吧)
通过创建一个CABasicAnimation对象,你就可以创建出一个动画。下面的例子创建了一个动画,将图层旋转了整整360度:
- CABasicAnimation
*animation "transform"];= [CABasicAnimation animationWithKeyPath:@ -
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotatio n(3.1415, 0, 0, 1.0)]; -
animation.duration =3.0; -
animation.cumulative =YES; -
animation.repeatCount=2;
- [mapView.layer
addAnimation:animation "animation"];forKey:@
八、图层变换
Quartz Core的渲染能力可以像三维一样对二维图像进行任意操纵。一个图像可以在x-y-z三维轴上进行任意角度旋转、缩放和扭曲。CATransform3D 函数族是苹果的Cover Flow 技术 以及 iPhone上使用的其他美观特效的幕后力量。iPhone 支持包括缩放、旋转、仿射、平移等。
变换实在单独的图层上执行的,因此多个变换可以在一个图层表面上同时进行。Quartz Core 框架用 CATransform3D对象来执行变换。这个对象作用于视图的图层,根据期望的三维设置对图层进行弯折或者其他操作。应用程序可以仍然将对象看作是二维的,但是当对象呈现给用户时,会遵从已经作用于图层之上的任何变换。下面的例子创建了一个变换,目的是对一个图层进行旋转:
- CATransform3D
myTransform; - myTransform
= CATransform3DMakeRotatio n(angle,x,y,z);
要将一个图层绕水平轴转动(垂直转动)45度,可以使用下面的代码:
- myTransform
= 0.78,1.0,0.0,0.0);//0.78CATransform3DMakeRotatio n( 是角度45度换成弧度得到的
- myTransform
= 0.78,0.0,1.0,0.0);CATransform3DMakeRotatio n(
- double
radians( floatdegrees){ -
return (degrees* 3.14159265)/180.0; - }
- myTransform
= 45.0),0.0,1.0,0.0);CATransform3DMakeRotatio n( radians(
- roleView.layer.transform
= myTransform;
- QuartzCore/QuartzCore框架
- QuartzCore框架
- QuartzCore框架
- QuartzCore
- QuartzCore
- QuartzCore
- QuartzCore
- iOS之QuartzCore框架
- QuartzCore框架学习-CADisplayLink
- QuartzCore框架学习-CAEmitterLayer
- QuartzCore框架学习-CAGradientLayer
- QuartzCore框架 CATransition动画
- QuartzCore框架简介
- QuartzCore画图框架粗浅使用
- QuartzCore框架-- iOS中的动画
- QuartzCore.framework 框架CALayer Animation
- QuartzCore.framework
- iOS学习笔记之QuartzCore框架
- 在php中实现分页代码 有注释
- Objective-C 内存管理教程和…
- autorelease pool 原理剖析
- 最全的新浪微博接口测试说明
- File Save type 归档形式存储文件…
- QuartzCore/QuartzCore框架
- iOS项目常用第三方开源库
- UITabBarController使用详解
- iOS单例模式的实现
- iOS上常用四种数据存取方法
- 在ios中设置UINavigationBar的背景…
- iOS中侧边栏的添加
- iOS中NSNotificationCenter…
- 关于 下拉刷新EGORefre…