神奇的CALayer

2018-11-18  本文已影响0人  木木一直在哭泣

一、CALayer

CALayer类在概念上和UIView类似,也可以像View一样添加一些子layer(图片,文本等等),也能够像View一样,管理子图层的位置大小等等,并且CALayer有一些非常重要的属性和方法,iOS中的动画就是通过这些来做动画和变换,CALayer和UIView最大的不同就是CALayer不处理用户的交互。

二、UIView和CALayer之间的区别

1、UIView是用来显示内容的,可以处理用户事件。直接继承UIResponser。
2、CALayer是用来绘制内容的,不能处理用户事件。直接继承NSObject。
3、 UIView和CALayer是相互依赖的关系。UIView依赖于CALayer提供的内容,CALayer依赖UIView提供的容器来显示绘制的内容。

三、CALayer的常用属性

//宽度和高度
@property CGRect bounds;

//位置(默认指中点,具体由anchorPoint决定)
@property CGPoint position;

//锚点(x,y的范围都是0-1),决定了position的含义
@property CGPoint anchorPoint;

//背景颜色(CGColorRef类型)
@propertyCGColorRefbackgroundColor;

//形变属性
@property CATransform3D transform;

//边框颜色(CGColorRef类型)
@property  CGColorRef  borderColor;

//边框宽度
@property CGFloat borderWidth;

//圆角半径
@property CGFloat cornerRadius;

//内容(比如设置为图片CGImageRef)
@property(retain) id contents;

可以通过设置contents属性给UIView设置背景图片:

UIImage *image = [UIImage imageNamed:@"Snowman.png"]; 
  self.layerView.layer.contents = (__bridge id)image.CGImage;

给contents赋CGImage的值不是唯一的设置寄宿图的方法。我们可以直接用Core Graphics直接绘制寄宿图。能够通过继承UIView并实现-drawRect: 方法来自定义绘制。如果你不需要寄宿图,那就不要创建这个方法了,这会造成CPU资源和内存的浪费,这也是为什么苹果建议:如果没有自定义绘制的任务就不要在子类中写一个空的-drawRect:方法。

四、专用图层

 self.view.backgroundColor = [UIColor colorWithRed:102.0/255.0 green:184.0/255.0 blue:234.0/255.0 alpha:1.0];
    
    UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(80, 100, 100, 100)];
    UIBezierPath *roundPath = [UIBezierPath bezierPathWithRect:CGRectMake(110, 150, 100, 100)];
    [circlePath appendPath:roundPath];
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(150, 200, 100, 100) byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(30, 30)];
    [circlePath appendPath:path];
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.path = circlePath.CGPath;
    shapeLayer.fillColor = self.view.backgroundColor.CGColor;
    CAGradientLayer * gradientLayer = [[CAGradientLayer alloc] init];
    gradientLayer.frame = self.view.bounds;
    gradientLayer.startPoint = CGPointMake(0, 0);
    gradientLayer.endPoint = CGPointMake(0, 1);
    gradientLayer.colors = @[(__bridge id)[UIColor colorWithWhite:0 alpha:0.4].CGColor,
                         (__bridge id)[UIColor colorWithWhite:0 alpha:0.82].CGColor];
    gradientLayer.mask = shapeLayer;
    [self.view.layer addSublayer:gradientLayer];
运行效果: CA39CF825B4E8FF56062B8694CFE288E.png
上一篇下一篇

猜你喜欢

热点阅读