CALayer 基础
来源:互联网 发布:深圳网络教育报名 编辑:程序博客网 时间:2024/05/01 21:16
<pre name="code" class="html">自定义图层 和 顺序 - (void)viewDidLoad { [super viewDidLoad]; MyView *muView = [[MyView alloc] initWithFrame:self.view.bounds]; muView.backgroundColor = [UIColor redColor]; // muView.layer.delegate = muView; // [muView setNeedsDisplay]; [self.view addSubview:muView]; // [self diyLayer2]; // // // 视图图层的代理 是 视图本身 不能修改代理 // self.view.layer.delegate = self.view; // 0. 无论采取哪种方式,必须调用CALayer的setNeedDisplay才能正常显示图层 // 1. 当UIView需要显示时,它内部的layer层会准备好一个CGContextRef图形上下文 // 2. 调用delegate(UIView)的drawLayer:inContext方法,并且传入一个已经准备好的CGContextRef对象, // 而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法 // 3. 平常在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入CGContextRef中,然后被拷贝至屏幕 // 1. layer 会准备一个layer Graphics context 图形上下文 // 2. 调用layer的代理方法画东西 // 3. drawlayer:incontext会调用drawrect方法 drawrect会获取layer的图形上下文 }- (void)diyLayer2 { // 代理画 CALayer *layer = [CALayer layer]; layer.bounds = CGRectMake(0, 0, 100, 100); layer.backgroundColor = [UIColor blueColor].CGColor; [layer setAnchorPoint:CGPointZero]; // 设置代理 layer.position = CGPointMake(30, 40); layer.delegate = self; [layer setNeedsDisplay]; [self.view.layer addSublayer:layer]; }#pragma mark - 图层 - 代理方法- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { CGContextSetRGBFillColor(ctx, 1, 0, 0, 1); CGContextAddRect(ctx, CGRectMake(0, 0, 30, 30)); CGContextFillPath(ctx); }- (void)diyLayer { // 自己画 MyLayer *layer = [MyLayer layer]; layer.bounds = CGRectMake(0, 0, 100, 100); layer.backgroundColor = [UIColor blueColor].CGColor; [layer setAnchorPoint:CGPointZero]; [layer setNeedsDisplay]; [self.view.layer addSublayer:layer];}
#pragma mark - UIImageView的layer- (void)myImageVieLayer { UIImage *image = [UIImage imageNamed:@"icon.jpg"]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [imageView setFrame:CGRectMake(50, 50, 200, 200)]; [self.view addSubview:imageView]; // 1. 圆角半径 // 提示:在imageView中,图层不只有一个,如果想要实现圆角效果,需要设置一个跟随属性 // masksToBounds属性可以让imageView中的所有子图层跟随imageView一起变化 imageView.layer.cornerRadius = 100.0f; // 跟随属性 [imageView.layer setMasksToBounds:YES]; // 2. 阴影 // 提示:如果设置了makesToBounds属性,imageView的阴影效果无效 [imageView.layer setShadowColor:[UIColor redColor].CGColor]; [imageView.layer setShadowOffset:CGSizeMake(10, 10)]; [imageView.layer setShadowOpacity:1.0f]; // 3. 边框 [imageView.layer setBorderColor:[UIColor blueColor].CGColor]; [imageView.layer setBorderWidth:3.0f]; // 4. 形变属性,在CALayer的属性是3D的,不再是2D的 // 提示: 形变参数使用set方法时,只能应用一种形变(后面覆盖前面的。) // 1> 平移属性 [imageView.layer setTransform:CATransform3DMakeTranslation(0, -100, 0)];// 向上移动100个点 // 2> 缩放属性 [imageView.layer setTransform:CATransform3DMakeScale(0.5, 1.0, 1.0)]; // 3> 旋转属性 // 要延哪个轴旋转,指定一个数值1.0即可,图像本身没有厚度,如果按照x或者y旋转90度,图像是不可见的。 [imageView.layer setTransform:CATransform3DMakeRotation(M_PI/3, 1, 0, 0)]; // 5. 利用keyPath设置形变属性 这几个属性可以组合用 和 4直接设置形变属性 不相同 // 1> 平移属性 [imageView.layer setValue:@-100 forKey:@"transform.translation.y"]; // 2> 缩放属性 [imageView.layer setValue:@0.5 forKey:@"transform.scale"]; // 3> 旋转属性 [imageView.layer setValue:@(M_PI_2) forKey:@"transform.rotation.z"];}#pragma mark - ‘自定义view的layer’- (void)myViewLayer { // 在实现核心动画时,本质上是将CALayer中的内容转化为位图,从而便于图形图形的操纵 // 每个UIView内部都有一个Layer属性 self.view.backgroundColor = [UIColor lightGrayColor]; // 1. 自定义UIView的图层属性 UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)]; myView.backgroundColor = [UIColor redColor]; [self.view addSubview:myView]; // 1) 圆角半径 myView.layer.cornerRadius = 10.0f; // 2) 阴影 // 因为CoreAnimation是跨平台的,基于QuartzCore框架,在CoreAnimation中不能使用任何跟UI有关的方法,是因为UIKit框架仅能适用于iOS平台 // 要设置阴影除了颜色之外,还需要指定‘偏移量’和‘透明度’ // 1>阴影颜色 [myView.layer setShadowColor:[UIColor greenColor].CGColor]; // 2>阴影偏移量 左 下 [myView.layer setShadowOffset:CGSizeMake(10, 10)]; // 3> 阴影透明度 [myView.layer setShadowOpacity:1.0f]; // 3) 边框 [myView.layer setBorderWidth:3.0f]; [myView.layer setBorderColor:[UIColor blueColor].CGColor];}
创建 自定义图层 - 锚点的使用 // 把内容画到自己的层上,当试视图在层上完成绘图后,系统会将图层拷贝到屏幕 // 每个视图都有一个层,而每个图层又有很多层 // layer的设计目的是提供视图的基本可视内容 // 1. 自定义图层 CALayer *myLayer = [CALayer layer]; // 将自定义图层添加到视图的根图层之上 [self.view.layer addSublayer:myLayer]; self.myLayer = myLayer; // 2. 设置属性 // 1> 设置边框 [myLayer setBounds:CGRectMake(10, 10, 200, 200)]; // 2> 设置背景颜色 [myLayer setBackgroundColor:[UIColor redColor].CGColor]; // 3> 设置中心点 (默认是0,0,对应着UIView的center) position相对于父图层的位置 [myLayer setPosition:CGPointMake(10, 10)]; // 4> 设置内容 UIImage *image = [UIImage imageNamed:@"21.jpg"]; [myLayer setContents:(id)image.CGImage]; // 5> 锚点 它传说中也叫做定位点 (x,y的范围都是0-1) 决定了position的含义 // 默认值 (0.5,0.5) // 作用:主要控制图层的位置 以及旋转的轴 //~~~~ 通过比例,锚点不需要知道图层具体的大小啊,让锚点去找position吧~~~ [myLayer setAnchorPoint:CGPointMake(1, 1)]; // // [myLayer setTransform:CATransform3DMakeRotation(M_PI, 0, 0, 1)];
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (self.myLayer.anchorPoint.x == 0) { self.myLayer.anchorPoint = CGPointMake(1, 1); } else { self.myLayer.anchorPoint = CGPointMake(0, 0); }}
隐式动画的属性 和 使用- (void)viewDidLoad { [super viewDidLoad]; // 1. 实例化自定义图层 CALayer *myLayer = [CALayer layer]; // 这是bounds [myLayer setBounds:CGRectMake(0, 0, 100, 100)]; // 这是背景颜色 [myLayer setBackgroundColor:[UIColor redColor].CGColor]; // 这是中心位置 [myLayer setPosition:CGPointMake(50, 50)]; [self.view.layer addSublayer:myLayer]; self.myLayer = myLayer; self.myLayer.hidden = YES;}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { self.myLayer.hidden = NO; UITouch *touch = touches.anyObject; CGPoint location = [touch locationInView:self.view]; // // 关闭动画 默认0.25秒 // [CATransaction begin]; // [CATransaction setDisableActions:YES]; // 位置 [self.myLayer setPosition:location]; // 颜色 CGFloat r = arc4random_uniform(256) / 255.0; CGFloat g = arc4random_uniform(256) / 255.0; CGFloat b = arc4random_uniform(256) / 255.0; UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:1.0f]; // 随机颜色 self.myLayer.backgroundColor = color.CGColor; // 随机透明度 CGFloat alpha = (arc4random_uniform(5)+1.0)/10.0 + 0.5;// Opacity 不透明 [self.myLayer setOpacity:alpha]; // 尺寸 NSInteger size = arc4random_uniform(50) + 51; [self.myLayer setBounds:CGRectMake(20,20, size, size)]; // 圆角 NSInteger radius = arc4random_uniform(50); [self.myLayer setCornerRadius:radius]; // 旋转角度 CGFloat angle = arc4random_uniform(180) / 180.0*M_PI; [self.myLayer setTransform:CATransform3DMakeRotation(angle, 0, 0, 1)]; // 内容 // self.myLayer setContents:<#(id)#> // [CATransaction commit]; }
CALayer 图层通过代理- (void)viewDidLoad { [super viewDidLoad]; // 1. 实例化子图层 CALayer *myLayer = [CALayer layer]; [myLayer setBounds:CGRectMake(0, 0, 200, 200)]; [myLayer setBackgroundColor:[UIColor redColor].CGColor]; [myLayer setCornerRadius:2.0f]; [myLayer setPosition:CGPointMake(100, 100)]; [self.view.layer addSublayer:myLayer]; self.myLayer = myLayer; // 提示,如果要重绘CALayer,必须要调用setNeedDisplay // 不能够将视图设置为layer的代理 [self.myLayer setDelegate:self]; [self.myLayer setNeedsDisplay]; NSLog(@"%@",self.myLayer);}- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { NSLog(@"%@",layer); // 在core animation中不能使用UI的方法 // 蓝色矩形矩形// [[UIColor blueColor] set]; CGRect rect = CGRectMake(50, 50, 100, 100); CGContextSetRGBFillColor(ctx, 0, 0, 1.0, 1.0); CGContextSetRGBStrokeColor(ctx, 0, 1, 0, 1); CGContextAddRect(ctx, rect); CGContextDrawPath(ctx, kCGPathEOFillStroke); // UIRectFill(rect); }
自定义Layer- (void)drawInContext:(CGContextRef)ctx { NSLog(@"drawInContect"); // 绘图层Ellipse 圆形 // 青色的圆 CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100)); CGContextSetRGBFillColor(ctx, 0, 1.0, 1.0, 1.0); CGContextDrawPath(ctx, kCGPathFill);// CGContextFillPath(ctx); // 蓝色的圆 CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 100)); CGContextSetRGBFillColor(ctx, 0, 0, 1.0, 1.0); CGContextDrawPath(ctx, kCGPathFill); // 绘制头像 // 在绘图的时候可以利用上下文的形变来画图 // 可以利用形变属性的缩放实现图片的反转 (1,-1) // 利用平移恢复位置(向下平移坐标系) CGContextScaleCTM(ctx, 1.0, -1.0); CGContextTranslateCTM(ctx, 0, -self.bounds.size.height); UIImage *image = [UIImage imageNamed:@"icon.jpg"]; CGContextDrawImage(ctx, CGRectMake(50, 50, 100, 100), image.CGImage); }
跟上一个衔接。@interface MyView ()@property (nonatomic,weak) MyLayer *myLayer;@end@implementation MyView- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { NSLog(@"init view"); MyLayer *myLayer = [MyLayer layer]; [self.layer addSublayer:myLayer]; [myLayer setBackgroundColor:[UIColor redColor].CGColor]; [myLayer setBounds:self.bounds]; [myLayer setPosition:CGPointMake(100, 100)]; self.myLayer = myLayer; [self.myLayer setNeedsDisplay]; } return self;}- (void)drawRect:(CGRect)rect { NSLog(@"drawRect");}/** 会先调用这个方法,然后调用drawrect方法 */- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { [super drawLayer:layer inContext:ctx]; NSLog(@"draw layer");}
0 0
- CALayer 基础
- CALayer 基础
- CALayer基础
- CALayer 基本基础
- calayer基础学习
- CALayer基础运用
- CALayer基础动画
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- Spring
- HDU 5427 A problem of sorting
- Linux下Lapack如何安装
- gdb 远程调试android进程
- 测试插入代码
- CALayer 基础
- 使用Charles对手机app网络包进行分析
- Java字符串反转
- Java 利用 SWFUpload多文件上传 session 为空失效,不能验证的问题
- jQuery-使用jQuery进行Dom操作
- 【BLE】CC2541之发现多个特征值句柄
- 1094. The Largest Generation (25)
- 在android中批量执行sqlite的sql脚本
- kali linux 升级至2.0