Core Animation之简单使用CALayer

来源:互联网 发布:安德罗妮淘宝店 编辑:程序博客网 时间:2024/05/16 00:38
1、什么是CALayer
CALayer是个简单的类,它是用来在屏幕上显示内容展示的矩形区域。 靠,这是不描述UIView的话吗?其实他们是有区别的。每个UIView都有一个根CALayer,UIView在这个layer上描绘东西。
 
那怎么访问这个layer呢,很简单:
  1. CALayer *myLayer = myView.layer; 
CALayer有这么些属性,可以设置改变层的显示:
 
1.层的大小和位置
2.层的背景颜色
3.层的内容(图像,core graphics)
4.层的的圆角,半径
5.层的阴影设置
等等....
 
2、开始
新建项目默认的模版里是QuartzCore库的,先添加它,才能使用CALayer。
 
小试牛刀看看。
设置层的背景颜色,层的设置圆角半径为20
 
  1. #import <QuartzCore/QuartzCore.h> 
  2.   
  3. // Uncomment viewDidLoad and add the following lines 
  4. self.view.layer.backgroundColor = [UIColor orangeColor].CGColor; 
  5. self.view.layer.cornerRadius = 20.0; 
 
3、层和子层
获取一个新CALayer的实例
  1. CALayer *sublayer = [CALayer layer]; 
 
设置layler的属性,下面分别是:
设置背景色,
阴影的偏差值,
阴影的半径,
阴影的颜色,
阴影的透明度,
子层的freme值。
然后把新的层add到view的层里。
  1. CALayer *sublayer = [CALayer layer]; 
  2.     sublayer.backgroundColor = [UIColor purpleColor].CGColor; 
  3.     sublayer.shadowOffset = CGSizeMake(0, 3); 
  4.     sublayer.shadowRadius = 5.0; 
  5.     sublayer.shadowColor = [UIColor blackColor].CGColor; 
  6.     sublayer.shadowOpacity = 0.8; 
  7.     sublayer.frame = CGRectMake(30, 30, 128, 192); 
  8.     [self.view.layer addSublayer:sublayer]; 
效果如下:
4、添加图片内容和层的圆角
 
主要内容有:
新建imagelayer放置图片
设置圆角半径cornerRadius
设置层的内容contents为图片
边界遮罩masksToBounds
 
  1. CALayer *sublayer = [CALayer layer]; 
  2. sublayer.backgroundColor = [UIColor purpleColor].CGColor; 
  3. sublayer.shadowOffset = CGSizeMake(0, 3); 
  4. sublayer.shadowRadius = 5.0; 
  5. sublayer.shadowColor = [UIColor blackColor].CGColor; 
  6. sublayer.shadowOpacity = 0.8; 
  7. sublayer.frame = CGRectMake(30, 30, 128, 192); 
  8. sublayer.borderColor = [UIColor blackColor].CGColor; 
  9. sublayer.borderWidth = 2.0; 
  10. sublayer.cornerRadius = 10.0; 
  11. [self.view.layer addSublayer:sublayer]; 
  12.  
  13. CALayer *imageLayer = [CALayer layer]; 
  14. imageLayer.frame = sublayer.bounds; 
  15. imageLayer.cornerRadius = 10.0; 
  16. imageLayer.contents = (id)[UIImage imageNamed:@"snaguosha.png"].CGImage; 
  17. imageLayer.masksToBounds = YES; 
  18. [sublayer addSublayer:imageLayer]; 
效果:
 
有圆角就是好看很多。
 
5、自定义绘画内容到图层
如果不想使用图片内容,而是想用 Core Graphics绘制内容到层上的话也简单。
这里主要靠viewController类实现一个drawLayer:inContext方法,并把它设置成layer的代理。代码如下:
 
  1. static inline double radians (double degrees) { return degrees * M_PI/180; } 
  2.  
  3. void MyDrawColoredPattern (void *info, CGContextRef context) { 
  4.      
  5.     CGColorRef dotColor = [UIColor colorWithHue:0 saturation:0 brightness:0.07 alpha:1.0].CGColor; 
  6.     CGColorRef shadowColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.1].CGColor; 
  7.      
  8.     CGContextSetFillColorWithColor(context, dotColor); 
  9.     CGContextSetShadowWithColor(context, CGSizeMake(0, 1), 1, shadowColor); 
  10.      
  11.     CGContextAddArc(context, 3, 3, 4, 0, radians(360), 0); 
  12.     CGContextFillPath(context); 
  13.      
  14.     CGContextAddArc(context, 16, 16, 4, 0, radians(360), 0); 
  15.     CGContextFillPath(context); 
  16.      
  17.  
  18. - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context { 
  19.      
  20.     CGColorRef bgColor = [UIColor colorWithHue:0 saturation:0 brightness:0.15 alpha:1.0].CGColor; 
  21.     CGContextSetFillColorWithColor(context, bgColor); 
  22.     CGContextFillRect(context, layer.bounds); 
  23.      
  24.     static const CGPatternCallbacks callbacks = { 0, &MyDrawColoredPattern, NULL }; 
  25.      
  26.     CGContextSaveGState(context); 
  27.     CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL); 
  28.     CGContextSetFillColorSpace(context, patternSpace); 
  29.     CGColorSpaceRelease(patternSpace); 
  30.      
  31.     CGPatternRef pattern = CGPatternCreate(NULL, 
  32.                                            layer.bounds, 
  33.                                            CGAffineTransformIdentity, 
  34.                                            24, 
  35.                                            24, 
  36.                                            kCGPatternTilingConstantSpacing, 
  37.                                            true
  38.                                            &callbacks); 
  39.     CGFloat alpha = 1.0; 
  40.     CGContextSetFillPattern(context, pattern, &alpha); 
  41.     CGPatternRelease(pattern); 
  42.     CGContextFillRect(context, layer.bounds); 
  43.     CGContextRestoreGState(context); 
 
在viewController中加入:
  1. static inline double radians (double degrees) { return degrees * M_PI/180; } 
  2.  
  3. void MyDrawColoredPattern (void *info, CGContextRef context) { 
  4.      
  5.     CGColorRef dotColor = [UIColor colorWithHue:0 saturation:0 brightness:0.07 alpha:1.0].CGColor; 
  6.     CGColorRef shadowColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.1].CGColor; 
  7.      
  8.     CGContextSetFillColorWithColor(context, dotColor); 
  9.     CGContextSetShadowWithColor(context, CGSizeMake(0, 1), 1, shadowColor); 
  10.      
  11.     CGContextAddArc(context, 3, 3, 4, 0, radians(360), 0); 
  12.     CGContextFillPath(context); 
  13.      
  14.     CGContextAddArc(context, 16, 16, 4, 0, radians(360), 0); 
  15.     CGContextFillPath(context); 
  16.      
  17.  
  18. - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context { 
  19.      
  20.     CGColorRef bgColor = [UIColor colorWithHue:0 saturation:0 brightness:0.15 alpha:1.0].CGColor; 
  21.     CGContextSetFillColorWithColor(context, bgColor); 
  22.     CGContextFillRect(context, layer.bounds); 
  23.      
  24.     static const CGPatternCallbacks callbacks = { 0, &MyDrawColoredPattern, NULL }; 
  25.      
  26.     CGContextSaveGState(context); 
  27.     CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL); 
  28.     CGContextSetFillColorSpace(context, patternSpace); 
  29.     CGColorSpaceRelease(patternSpace); 
  30.      
  31.     CGPatternRef pattern = CGPatternCreate(NULL, 
  32.                                            layer.bounds, 
  33.                                            CGAffineTransformIdentity, 
  34.                                            24, 
  35.                                            24, 
  36.                                            kCGPatternTilingConstantSpacing, 
  37.                                            true
  38.                                            &callbacks); 
  39.     CGFloat alpha = 1.0; 
  40.     CGContextSetFillPattern(context, pattern, &alpha); 
  41.     CGPatternRelease(pattern); 
  42.     CGContextFillRect(context, layer.bounds); 
  43.     CGContextRestoreGState(context); 
这样,Core Graphics绘制了一个有质地的图像到customDrawn层上,这个绘制教程请参考: Core Graphics 101: Patterns http://www.raywenderlich.com/33496/core-graphics-tutorial-patterns
 
咱们看下这很酷的效果:
 
这个是不是像mac电脑上按下F12键时出来的背景。
 
本篇例子代码:http://download.csdn.net/detail/totogo2010/5083326
参考:http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial
原创粉丝点击