CALayer子类
作者:互联网
那我们就先讲讲常用的吧
CAShapeLayer
用UIBezierPath可以绘制任意路径的图像,那么CAShapeLayer就可以通过UIBezierPath绘制任意形状的阴影了
- (void)viewDidLoad
{
[super viewDidLoad];
//create path
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(175, 100)];
[path addArcWithCenter:CGPointMake(150, 100) radius:25 startAngle:0 endAng
[path moveToPoint:CGPointMake(150, 125)];
[path addLineToPoint:CGPointMake(150, 175)];
[path addLineToPoint:CGPointMake(125, 225)];
[path moveToPoint:CGPointMake(150, 175)];
[path addLineToPoint:CGPointMake(175, 225)];
[path moveToPoint:CGPointMake(100, 150)];
[path addLineToPoint:CGPointMake(200, 150)];
//create shape layer
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.strokeColor = [UIColor redColor].CGColor;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.lineWidth = 5;
shapeLayer.lineJoin = kCALineJoinRound;
shapeLayer.lineCap = kCALineCapRound;
shapeLayer.path = path.CGPath;
//add it to our view
[self.containerView.layer addSublayer:shapeLayer];
}
通过以上代码就可以画出下面的小柴人了
圆角(部分)
本来可以用cornerRadius属性,但是如果要实现矩形的某一个角是圆角呢
用CAShapeLayer属性,它有一个优势就是可以单独指定每个角。
self.view.backgroundColor = [UIColor whiteColor];
CGRect rect = CGRectMake(50, 50, 100, 100);
CGSize radii = CGSizeMake(20, 20);
UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomLeft;
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.strokeColor = [UIColor redColor].CGColor;
shapeLayer.path = path.CGPath;
[self.view.layer addSublayer:shapeLayer];
CATextLayer
CATextLayer ,它以图层的形式包含了 UILabel 几乎所有的绘制特性,并且额外提供了一些新的特性。
同样, CATextLayer 比 UILabel渲染得快得多。很少有人知道在iOS 6及之 其实是通过WebKit来实现绘制的,这样就造成了当有很多文 字的时候就会有极大的性能压力。而 CATextLayer 使用了Core text,并且渲染得 非常快。
让我们来尝试用 CATextLayer 来显示一些文字
CATextLayer *textLayer = [CATextLayer layer];
textLayer.frame = _labelView.bounds;
[_labelView.layer addSublayer:textLayer];
textLayer.foregroundColor = [UIColor blackColor].CGColor;
textLayer.alignmentMode = kCAAlignmentJustified;
textLayer.wrapped = YES;
UIFont *font = [UIFont systemFontOfSize:15];
CFStringRef fontName = (__bridge CFStringRef)font.fontName;
CGFontRef fontRef = CGFontCreateWithFontName(fontName);
textLayer.font = fontRef;
textLayer.fontSize = font.pointSize;
CGFontRelease(fontRef);
textLayer.string = @"hgfghgjgdghiewirwh thgjkvnjvnjvnxvndvnjdgnfjghfjghfghdjkgdkghgfghgjgdghiewirwh thgjkvnjvnjvnxvndvnjdgnfjghfjghfghdjkgdkg";
textLayer.contentsScale = [UIScreen mainScreen].scale;
CATextLayer的string属性并不是你想象的NSString类型,而是 id类型。这样你既可以用NSString
也可以用NSAttributedString来指定文本了(注意, NSAttributedString 并不是 NSString 的子类)。属性化字符 串是iOS用来渲染字体风格的机制,它以特定的方式来决定指定范围内的字符串的 原始信息,比如字体,颜色,字重,斜体等。
每一个 UIView 都是寄宿在一 个 CALayer 的示例上。这个图层是由视图自动创建和管理的,那我们可以用别的 图层类型替代它么?一旦被创建,我们就无法代替这个图层了。但是如果我们继承 了 UIView ,那我们就可以重写 +layerClass 方法使得在创建的时候能返回一个 不同的图层子类。 UIView 会在初始化的时候调用 +layerClass 方法,然后用它的返回类型来创建宿主图层。
同样的道理,我们就可以新建一个类LayerLabel继承于UILabel,然后在LayerLabel中实现+ (Class)layerClass方法,
重写UILabel的一系列方法,就可以创建一个支持 UILabel 所有功能甚至更多功能的LayerLabel类
CAGradientLayer
CAGradientLayer是用来生成两种或更多颜色平滑渐变的。
基础渐变
CAGradientLayer也有startPoint,endPoint属性,他们决定了渐变的方向。这两个参数是以单位坐标系进行的定义,所以左上角坐标是{0, 0},右下角坐标 是{1, 1}。
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.view.bounds;
[self.view.layer addSublayer:gradientLayer];
//set gradient colors
gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,
(__bridge id)[UIColor blueColor].CGColor];
//set gradient start and end points
gradientLayer.startPoint = CGPointMake(0, 0);
gradientLayer.endPoint = CGPointMake(1, 1);
多重渐变
colors属性可以包含很多颜色,所以创建一个彩虹一样的多重渐变 也是很简单的。默认情况下,这些颜色在空间上均匀地被渲染,但是我们可以 用 locations 属性来调整空间。 locations 属性是一个浮点数值的数组(以 NSNumber 包装)。这些浮点数定义了 colors 属性中每个不同颜色的位 置,同样的,也是以单位坐标系进行标定。0.0代表着渐变的开始,1.0代表着结 束。
locations数组并不是强制要求的,但是如果你给它赋值了就一定要确 locations 的数组大小和 colors 数组大小一定要相同,,否则你将会得到一个空白的渐变。
现在变成了从红到黄到绿
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.view.bounds;
[self.view.layer addSublayer:gradientLayer];
//set gradient colors
gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,(__bridge id)[UIColor yellowColor].CGColor,(__bridge id)[UIColor greenColor].CGColor];
//set locations
gradientLayer.locations = @[@0.0, @0.25, @0.5];
//set gradient start and end points
gradientLayer.startPoint = CGPointMake(0, 0);
gradientLayer.endPoint = CGPointMake(1, 1);
标签:layer,textLayer,子类,gradientLayer,shapeLayer,CGPointMake,CALayer,path 来源: https://blog.csdn.net/qiangshuting/article/details/98074412