1.CALayer是低级组件,像是铺在一个内容固定对象上的一个片,非常灵活的支持在一个对象上显示内容,可在屏幕上弯曲或扭曲内容。
在MVC设计模式中,视图是V对象,层是M对象。层封装了布局,时序,可视的属性并且提供用于显示的内容,但是显示却不是层的职责。
每个UIView都有一个根层,它控制着内容最终被显示在屏幕上的方式。
单个层可以有很多子层。子层可以在最终屏幕渲染的时候被管理和缝合在一起。
访问层:
CALayer *layer = myView.layer;
[ myView.layer addSublayer:myView2.layer ];
2.大小和位置
Layer的frame属性和windows,view的frame相似。
myView.layer.frame = rect; myView.layer.position = centerPoint;
3.管理层 [ myView.layer insertSublayer: layer1 atIndex:1 ]; [ myView.layer insertSublayer: layer1 below: layer2]; [ myView.layer insertSublayer: layer1 above: layer2]; [ layer1 removeFromSuperlayer ]; [ layer1 replaceSublayer:layer2 with:layer3 ]; layer1.layer.hidden = YES;
4.渲染 对层的更新可以不必立即显示给用户。当所有的层都准备好从画时,调用setNeedsDisplay。 [ layer1 setNeedsDisplay ]; [ layer1 setNeedsDisplayInRect: rect ];
5.动画
(1) 隐式动画 层的许多可视属性的改变可以产生隐式的动画效果,这些属性都默认地与一个动画相关联。通过简单地设置可视的属性值,层会由当前值到被设置的值产生渐变的动画效果。例如设置层的隐藏属性为真,将触发一个逐渐消失的动画效果。 (2)显式动画 显式的动画不改变层的属性。 所有的核心动画类都由抽象类CAAnimation继承而来。CAAnimation采用CAMediaTiming协议和CAAction协议。 CAMediaTiming协议规定了动画的持续时间,速度及重复次数。
CAAction协议规定了在响应由层触发的动作时,开始一个动画的标准方式。
当一个层被应用动画的时候,一个CATransition或CAAnimation对象附在层上。然后调用Quartz Core产生一个新线程,接管动画中所有的图像处理。开发者仅仅需要在增加一个理想的动画来加强层变换的效果。 下面的例子代码创建一个变换: CATransition *animation = [[CATransition alloc] init]; animation.duration = 1.0; animation.timingFunction = [ CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseIn ]; animation.type = kCATransitionPush; animation.subtype = kCATransitionFromRight; 目前, iPhone的SDK提供了有限的变换类型可以由用户创建。更多的变换如页扭曲和缩放变换,是被Quartz Core框架支持的,但只限于使用在苹果公司自己的应用程序上面。
可以通过创建一个CABasicAnimation对象来创建一个动画。下面创建了一个360度旋转层的动画: CABasicAnimation *animation = [ CABasicAnimation animationWithKeyPath: @"transform" ]; animation.toValue = [ NSValue valueWithCATransform3D: CATransform3DMakeRotation(3.1415, 0, 0, 1.0) ]; animation.duration = 2; animation.cumulative = YES; animation.repeatCount = 2; [layer1 addAnimation: animation forKey: @"animation" ];
其中,animationWithKeyPath的参数值是CALayer的一些属性的名称字符串。可搜索animationWithKeyPath,在左侧中找相关解释文档。
或者在 Animation Types and Timing Programming Guide
7.变形 Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像它是三维。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。更高级的有苹果的Cover Flow技术。 iPhone的支持缩放,旋转,仿射,翻转(translation)的转变,等等。这本书只提供了对层变换的一个介绍。
要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性 layer1.transform = CATransform3DMakeScale(-1.0, -1.0, 1.0); layer1.affineTransform =CGAffineTransformMakeRotation(45.0);
允许多变换在多层面上同时发生。Quartz Core框架使用CATransform3D 对象来进行变换。这个对象应用在view的层的上面,来执行弯曲和层的其它操作,从而实现一个理想的3D效果。当它被提交给用户的时候,程序将继续把它当作一个2D对象。
下面的例子创建了一个变换,旋转层: CATransform3D myTransform = CATransform3DMakeRotation(angle, x, y, z); 该CATransform3DMakeRotation函数创建了一个转变,将在三维轴坐标系以任意弧度旋转层。x-y-z轴的有个确定的范围(介于-1 和+1之间) 要水平(垂直)旋转45度,您可以使用下面的代码: myTransform = CATransform3DMakeRotation(0.78, 1.0, 0.0, 0.0); 要在Y轴上旋转相同的值: myTransform = CATransform3DMakeRotation(0.78, 0.0, 1.0, 0.0); 0.78是由角度值经计算转化为弧度值。要把角度值转化为弧度值,可以使用一个简单的公式Mπ/180 。例如, 45π/180 = 45 ( 3.1415 ) / 180 = 0.7853 。 myTransform = CATransform3DMakeRotation(radians(45.0), 0.0, 1.0, 0.0); CALayer对象提供了一个transform属性来连接转换,层将执行分配给transform属性的转换: imageView.layer.transform = myTransform;
8. 边框,圆角,阴影
设置圆角边框 someView.layer.cornerRadius =4.0f;
someView.layer.masksToBounds = YES;
//设置边框及边框颜色 someView.layer.borderWidth = 0.5f;
someView.layer.borderColor =[ [UIColor grayColor] CGColor];
//添加四个边阴影 _imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor; _imgvPhoto.layer.shadowOffset = CGSizeMake(0, 0); _imgvPhoto.layer.shadowOpacity = 0.5; _imgvPhoto.layer.shadowRadius = 10.0;
_ imgvPhoto.layer.masksToBounds = NO; //添加两个边阴影 _imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor; _imgvPhoto.layer.shadowOffset = CGSizeMake(4, 4); _imgvPhoto.layer.shadowOpacity = 0.5; _imgvPhoto.layer.shadowRadius = 2.0;
说明: ① someView 表示UIView及其之类; ② 必须引入:#import<QuartzCore/QuartzCore.h>
9.masksToBounds
决定其子层是否只有绘制在其bounds内的部分才显示。
设置UIImage或UIView圆角 、设置UIView边框的代码 http://blog.csdn.net/programer_qbsun/article/details/6799650
10.卷曲,半翻页
//创建CATransition对象 CATransition *animation = [CATransition animation]; //相关参数设置 [animation setDelegate:self]; [animation setDuration:1.0f]; [animation setTimingFunction:UIViewAnimationCurveEaseInOut]; //向上卷的参数 if(!isCurl) { //设置动画类型为pageCurl,并只卷一半 [animation setType:@"pageCurl"]; animation.endProgress=0.5; } //向下卷的参数 else { //设置动画类型为pageUnCurl,并从一半开始向下卷 [animation setType:@"pageUnCurl"]; animation.startProgress=0.5; } //卷的过程完成后停止,并且不从层中移除动画 [animation setFillMode:kCAFillModeForwards]; [animation setSubtype:kCATransitionFromBottom]; [animation setRemovedOnCompletion:NO]; isCurl=!isCurl;
//把要翻出的View提到最上面 [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
//把动画添加给layer [[self.view layer] addAnimation:animation forKey:@"pageCurlAnimation"];
原理是,向上翻的是最初layer的快照,卷曲层下面是实际的view。
11. 让一个view沿中间的水平线,翻转消失和出现的效果
-(void)click { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1]; if(!rotate) { CATransform3D myTransform = CATransform3DIdentity; myTransform.m34 = 0; //沿(0,1,0)这个向量旋转30度。 myTransform = CATransform3DRotate(myTransform,M_PI / 180 * 0, 0.0001, 0, 0); rotateView.layer.transform = myTransform; } else { CATransform3D myTransform = CATransform3DIdentity; myTransform.m34 = -0.005; //沿(0,1,0)这个向量旋转30度。 myTransform = CATransform3DRotate(myTransform,M_PI / 180 * 90, 1, 0, 0); rotateView.layer.transform = myTransform; } [UIView commitAnimations]; rotate=!rotate; }
12.
参考
http://www.yuephone.com/forum.php?mod=viewthread&action=printable&tid=75
http://www.cnblogs.com/gaoxiao228/archive/2012/05/04/2483519.html
http://www.buerguo.com/archives/162
http://www.buerguo.com/archives/162
http://paste.lisp.org/display/73547
http://www.opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/Availability.h
__OSX_AVAILABLE_STARTING() 可以同时指明这个函数开始可用时的桌面和手机os的版本号. http://www.cocoachina.com/bbs/read.php?tid=80453 http://www.cocoachina.com/bbs/read.php?tid=80453 http://www.cocoachina.com/bbs/simple/?t87118.html http://wenku.baidu.com/view/f478d71aa8114431b90dd870.html
