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