美文网首页
从UIView与Layer的爱恨情仇开始

从UIView与Layer的爱恨情仇开始

作者: Easy_VO | 来源:发表于2017-02-27 16:10 被阅读87次

    “在iOS当中,所有的视图都从一个叫做UIVIew的基类派生而来,UIView可以处理触摸事件,可以支持基于Core Graphics绘图,可以做仿射变换(例如旋转或者缩放),或者简单的类似于滑”

    “CALayer类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些内容(像图片,文本或者背景色),管理子图层的位置。它们有一些方法和属性用来做动画和变换。和UIView最大的不同是CALayer不处理用户的交互”
    CALayer并不清楚具体的响应链,即使它提供了一些方法判断某个触点是否在某个范围内.
    “每一个UIview都有一个CALayer实例的图层属性,也就是所谓的backing layer,视图的职责就是创建并管理这个图层,以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作。 ”

    “但是为什么iOS要基于UIView和CALayer提供两个平行的层级关系呢?为什么不用一个简单的层级来处理所有事情呢?原因在于要做职责分离,这样也能避免很多重复代码。在iOS和Mac OS两个平台上,事件和用户交互有很多地方的不同,基于多点触控的用户界面和基于鼠标键盘有着本质的区别,这就是为什么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因。他们功能上很相似,但是在实现上有着显著的区别。”

    虽然苹果封装好了一些动画,方便了我们的使用,但是弊端同样存在

    有一些UIView没有暴露出来的CALayer的功能:
    阴影,圆角,带颜色的边框
    3D变换
    非矩形范围
    透明遮罩
    多级非线性动画
    

    废话少说,操练起来:

    imgimg

    我曹,好大的图

    来不及解释,layer的contents属性,快上车

    _whiteView.layer.contents=(__bridge id)[UIImage imageNamed:@"callBg"].CGImage;
    CALayer *blueLayer = [CALayer new];
    blueLayer.frame = CGRectMake(50, 50, 40, 40);
    blueLayer.backgroundColor = [UIColor redColor].CGColor;
    
    UIImage *image = [UIImage imageNamed:@"chat_video_play"];
    blueLayer.contents = (__bridge id)image.CGImage;
    [_whiteView.layer addSublayer:blueLayer];
    

    相关文章

      网友评论

          本文标题:从UIView与Layer的爱恨情仇开始

          本文链接:https://www.haomeiwen.com/subject/mibzwttx.html