UIView和CALayer之间的关系

从框架来说

  • CALayer 基于 QuartzCore 框架
  • UIView 基于 UIKit 框架

从父类来说

  • 使用CALayer同样可以实现与UIImageView一样的展示效果。那么到底有什么区别呢?
  • 其实,CALayer是直接继承自NSObject的,而UIView是直接继承自UIResponder的。

所以、相比于CALayer来说、UIView多了一个事件处理功能、也就是说、CALayer是不能处理用户的触摸事件的、而UIView可以。

那么、当我们展示出来的东西需要实现和用户交互的时候去使用UIView、而不需要的交互的时候CALayer和UIView都可以。

当然、由于CALayer不需要处理交互事件、所以是轻量级的、性能要比UIView高。

代码验证

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.aView = [[UIView alloc] init];
    self.aLayer = [[CALayer alloc] init];
    
    //比较UIView对象个CALayer对象在内存中的大小
    NSLog(@"self.aView对象实际需要的内存大小: %zd", class_getInstanceSize([self.aView class]));//480
    NSLog(@"self.aView对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(self.aView)));//480
    NSLog(@"self.aLayer对象实际需要的内存大小: %zd", class_getInstanceSize([self.aLayer class]));//24
    NSLog(@"self.aLayer对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(self.aLayer)));//32

    NSLog(@"------");
    //针对于UILabel 和 CATextLayer内存对比
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30, 300, 300, 44)];
    label.text = @"label";
    [self.view addSubview:label];
    
    CATextLayer *textLayer = [[CATextLayer alloc] init];
    textLayer.frame = CGRectMake(30, 400, 300, 44);
    textLayer.string = @"CATextLayer";
    [self.view.layer addSublayer:textLayer];
    
    //比较UILabel对象个CATextLayer对象在内存中的大小
    NSLog(@"label对象实际需要的内存大小: %zd", class_getInstanceSize([label class]));//744
    NSLog(@"label对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(label)));//752
    NSLog(@"textLayer对象实际需要的内存大小: %zd", class_getInstanceSize([textLayer class]));//32
    NSLog(@"textLayer对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(textLayer)));//32
    
    NSLog(@"------");
    //添加了一些设置, 比如字体大小, 颜色, 换行, 字体长度变化
    label.text = @"123456789012345678901234567890";
    label.font = [UIFont fontWithName:@"PingFangSC-Regular" size:12];
    label.textColor = [UIColor redColor];
    
    textLayer.string = @"123456789012345678901234567890";
    textLayer.font =  (__bridge CFTypeRef _Nullable)(@"PingFangSC-Regular");
    textLayer.fontSize = 12;
    textLayer.foregroundColor = [UIColor redColor].CGColor;
    //比较UILabel对象个CATextLayer对象在内存中的大小
    NSLog(@"label对象实际需要的内存大小: %zd", class_getInstanceSize([label class]));//744
    NSLog(@"label对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(label)));//752
    NSLog(@"textLayer对象实际需要的内存大小: %zd", class_getInstanceSize([textLayer class]));//32
    NSLog(@"textLayer对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(textLayer)));//32
}

打印结果

2019-09-12 11:06:33.017943+0800 Demo[7030:27412457] self.aView对象实际需要的内存大小: 480
2019-09-12 11:06:33.018123+0800 Demo[7030:27412457] self.aView对象实际分配的内存大小: 480
2019-09-12 11:06:33.018249+0800 Demo[7030:27412457] self.aLayer对象实际需要的内存大小: 24
2019-09-12 11:06:33.018367+0800 Demo[7030:27412457] self.aLayer对象实际分配的内存大小: 32
2019-09-12 11:06:33.018478+0800 Demo[7030:27412457] ------
2019-09-12 11:06:33.019261+0800 Demo[7030:27412457] label对象实际需要的内存大小: 744
2019-09-12 11:06:33.019357+0800 Demo[7030:27412457] label对象实际分配的内存大小: 752
2019-09-12 11:06:33.019443+0800 Demo[7030:27412457] textLayer对象实际需要的内存大小: 32
2019-09-12 11:06:33.019542+0800 Demo[7030:27412457] textLayer对象实际分配的内存大小: 32
2019-09-12 11:06:33.019651+0800 Demo[7030:27412457] ------
2019-09-12 11:06:33.023849+0800 Demo[7030:27412457] label对象实际需要的内存大小: 744
2019-09-12 11:06:33.024001+0800 Demo[7030:27412457] label对象实际分配的内存大小: 752
2019-09-12 11:06:33.024106+0800 Demo[7030:27412457] textLayer对象实际需要的内存大小: 32
2019-09-12 11:06:33.085927+0800 Demo[7030:27412457] textLayer对象实际分配的内存大小: 32
  • 可以看得出来, 在对象的内存分配中, CATextLayer的内存大小明显要比UIView要轻量的多.
  • 对于一些只是用来展示的控件,比如是UIlabel,或者是ImageView. 完全可以用Layer来代替.

简单粗暴来理解 : 所有集成于UIView的控件,它们本身自带了一个CALayer层, 所以UIView里面的东西会比CALayer中的要多.


UIView和CALayer之间的关系_第1张图片
UIView中的CALayer


深入挖掘:

1.UIView和CALayer的坐标系统是一样的吗? Frame和Bounds中的size永远相等吗?
2.创建一个UIView,通过transform改变,比如是旋转30°,翻转45°,x轴缩放一般,改变的是UIView还是CALayer.?
3.对于UILabel与CATextLayer,既然Layer的内存更小,性能更优,为什么都不用CATextLayer,而是经常看到用的是UILabel?

UIView与CALayer的区别,很详细

你可能感兴趣的:(UIView和CALayer之间的关系)