其他分享
首页 > 其他分享> > CALayer子类

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