//
// LayerContentViewController.m
// LayerStudyDemo
//
// Created by apple on 2017/9/19.
// Copyright © 2017年 ZY. All rights reserved.
//
#import "LayerContentViewController.h"
@interface LayerContentViewController ()
@end
@implementation LayerContentViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self contentImageDemo];
}
//寄宿图
-(void)contentImageDemo{
UIImage * image = [UIImage imageNamed:@"timg.png"];
CALayer * imageLayer = [CALayer layer];
imageLayer.frame = CGRectMake(50, 200, 300, 300);
//contents 图层的寄宿图 是一个CGImageRef类型,它是一个指向CGImage结构的指针
imageLayer.contents = (__bridge id _Nullable)(image.CGImage);
//contentsGravity的目的是为了决定内容在图层的边界中怎么对齐,我们将使用kCAGravityResizeAspect,它的效果等同于UIViewContentModeScaleAspectFit, 同时它还能在图层中等比例拉伸以适应图层的边界。
imageLayer.contentsGravity = kCAGravityResizeAspect;
//contentsScale属性定义了寄宿图的像素尺寸和视图大小的比例,默认情况下它是一个值为1.0的浮点数。
//contentsScale的目的并不是那么明显。它并不是总会对屏幕上的寄宿图有影响。如果你尝试对我们的例子设置不同的值,你就会发现根本没任何影响。因为contents由于设置了contentsGravity属性,所以它已经被拉伸以适应图层的边界。
imageLayer.contentsScale= 5.f;
//我们裁切图片的时候肯定用过这个属性,是否绘制超出吧边界的视图
imageLayer.masksToBounds = YES;
//这个不用介绍了吧
imageLayer.cornerRadius = 5.0f;
//这个属性需要介绍下,我们以前见过美工给图在一张图上,我们应该怎么用呢。用这个属性我们就可以切出我们要的那一部分了。
imageLayer.contentsRect = CGRectMake(0, 0, 0.5, 0.5);
//contentsCenter其实是一个CGRect,它定义了一个固定的边框和一个在图层上可拉伸的区域。 改变contentsCenter的值并不会影响到寄宿图的显示,除非这个图层的大小改变了,你才看得到效果。
imageLayer.contentsCenter = CGRectMake(0, 0, 0.1, 0.1);
[self.view.layer addSublayer:imageLayer];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
CALayer有一个可选的delegate
属性,实现了CALayerDelegate
协议,当CALayer需要一个内容特定的信息时,就会从协议中请求。CALayerDelegate是一个非正式协议,其实就是说没有CALayerDelegate @protocol可以让你在类里面引用啦。你只需要调用你想调用的方法,CALayer会帮你做剩下的。(delegate
属性被声明为id类型,所有的代理方法都是可选的)。
当需要被重绘时,CALayer会请求它的代理给他一个寄宿图来显示。它通过调用下面这个方法做到的:
(void)displayLayer:(CALayerCALayer *)layer;
趁着这个机会,如果代理想直接设置contents
属性的话,它就可以这么做,不然没有别的方法可以调用了。如果代理不实现-displayLayer:
方法,CALayer就会转而尝试调用下面这个方法:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
在调用这个方法之前,CALayer创建了一个合适尺寸的空寄宿图(尺寸由bounds
和contentsScale
决定)和一个Core Graphics的绘制上下文环境,为绘制寄宿图做准备,他作为ctx参数传入。
//
// CoustomDrawViewController.m
// LayerStudyDemo
//
// Created by apple on 2017/9/22.
// Copyright © 2017年 ZY. All rights reserved.
//
#import "CoustomDrawViewController.h"
@interface CoustomDrawViewController ()<CALayerDelegate>
@end
@implementation CoustomDrawViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.layer.delegate = self;
[self.view.layer display];
}
////layer 绘图
//-(void)customDrawingDemo{
//
// CALayer * customLayer = [CALayer layer];
// customLayer.frame = CGRectMake((SCREEN_WIDTH-100)/2, (SCREEN_HEIGHT-100-64)/2, 100.0f, 100.0f);
// customLayer.backgroundColor = [UIColor yellowColor].CGColor;
// customLayer.delegate = self;
// customLayer.contentsScale = [UIScreen mainScreen].scale; //add layer to our view
// [self.view.layer addSublayer:customLayer];
// [customLayer display];
//}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
CGContextSetLineWidth(ctx, 10.0f);
CGContextSetStrokeColorWithColor(ctx, [UIColor greenColor].CGColor);
CGContextStrokeEllipseInRect(ctx, layer.bounds);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end