CALayer中包含的图就叫寄宿图,其中有个contents属性就是专门用来存放图片的
2.1 contents
CALayer | UIView | 说明 |
---|---|---|
contentGravity | contentMode | 和cotentMode一样,contentsGravity的目的是为了决定内容在图层的边界中怎么对齐,也就是拉伸方式;contentGravity 的值是字符串常量,contentMode的值是枚举 |
contentsScale | Retina 屏以前为1.0,Retina 屏为2.0,Plus机型为3.0,CATextLayer就经常需要设置layer.contentsScale = [UIScreen mainScreen].scale来让文字在不同屏幕下保证清晰 | |
maskToBounds | clipsToBounds | 是否显示超出边界的内容 |
contentsRect | 裁剪图片用的,使用的坐标是单位(IOS的三种坐标系统:点、像素、单位),默认的contentsRect是{0, 0, 1, 1} | |
contentsCenter | 与UIImage 的resizableImageWithCapInsets:类似 | 设置拉伸区域用的,默认的contentsCenter是{0, 0, 1, 1},常见用法是设置为{0.25, 0.25, 0.5, 0.5},原理就是很简单见原文的图示;另外这个属性可以在IB里直接设置 |
2.2 Custom Drawing
给图层的contents赋CGImage的值不是唯一的设置寄宿图的方法。我们也可以像-drawRect:方法那样用图层自己的绘图方法来自定义绘制,而drawRect事实上也是让底层的CALayer安排了重绘工作和保存了因此产生的图片
- (void)viewDidLoad
{
[super viewDidLoad];
CALayer *blueLayer = [CALayer layer];
blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
blueLayer.backgroundColor = [UIColor blueColor].CGColor;
////让图层自绘制有三步:
//第一步:设置代理,并遵循协议
blueLayer.delegate = self;
blueLayer.contentsScale = [UIScreen mainScreen].scale;
[self.layerView.layer addSublayer:blueLayer];
//第二步:和UIView的drawRect不同,CALayer要自己手动开启重绘方法
[blueLayer display];
}
//第三步:实现代理。
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
//draw a thick red circle
CGContextSetLineWidth(ctx, 10.0f);
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextStrokeEllipseInRect(ctx, layer.bounds);
}
另外一点与UIView的重绘不同的是,CALayer就算你没有设置
masksToBounds
,绘制的内容也不会超出边界
网友评论