• UIView 与 CALayer


    联系:

    1.

    UIView 有个属性 layer,可以返回它的主 CALayer 实例:
    CALayer *layer = myView.layer

    2.

    一个 UIView 可以有多个 CALayer, UIView 的尺寸样式都是由内部的 CALayer 来提供的

    3.

    两者都有树状层级结构,CALayer 有 subLayers, UIView 有 subViews

    区别:

    1.最大的区别

    CALayer 不能处理用户的触摸事件,而 UIView 可以
    UIView 继承自 UIResponder,可以处理用户的触摸事件
    CALayer 直接继承 NSObject,并没有相应的处理触摸事件的接口

    2.坐标系统

    CALayer 的坐标系统比 UIView 多了一个 anchorPoint 属性
    CALayer 具有以下属性:anchorPoint, position, bounds 和 transform 等
    UIView 具有以下属性:bounds, frame 等
    UIView 是由 CoreAnimation 来实现的。它真正的绘图部分,是由一个 CALayer 类来管理
    UIView 本身更像是一个 CALayer 的管理器,访问它的 frame,bounds 等,实际上内部都是在访问它所包含的 CALayer 的相关属性

    3.

    UIView 定义在 /System/Library/Frameworks/UIKit.framework
    CALayer 定义在/System/Library/Frameworks/QuartzCore.framework
    由此也可看出,UIView 侧重于对显示内容的管理,CALayer 侧重于对内容的绘制
    UIView 和 CALayer 是相互依赖的关系,UIView 依赖 CALayer 绘制的内容,CALayer 依赖 UIView 提供的容器来显示绘制的内容
    所以 CALayer 是基础,没有 CALayer,UIView 自身不会存在,然而,UIView 是 CALayer 的特殊实现,可响应触摸事件

    4.

    对于每一个 UIView 都有一个 layer,把这个 layer 且称作RootLayer,而不是 View 的根 Layer的叫做 非 RootLayer。我们对UIView的属性修改时时不会产生默认动画,而对单独 layer属性直接修改会

    在 Core Animation 编程指南的 “How to Animate Layer-Backed Views” 中,对为什么会这样做出了一个解释:

    UIView 默认情况下禁止了 layer 动画,但是在 animation block 中又重新启用了它们

    是因为任何可动画的 layer 属性改变时,layer 都会寻找并运行合适的 'action' 来实行这个改变。在 Core Animation 的专业术语中就把这样的动画统称为动作 (action,或者 CAAction)

    layer 通过向它的 delegate 发送 actionForLayer:forKey: 消息来询问提供一个对应属性变化的 action。delegate 可以通过返回以下三者之一来进行响应:

    它可以返回一个动作对象,这种情况下 layer 将使用这个动作
    它可以返回一个 nil, 这样 layer 就会到其他地方继续寻找
    它可以返回一个 NSNull 对象,告诉 layer 这里不需要执行一个动作,搜索也会就此停止
    当 layer 在背后支持一个 view 的时候,view 就是它的 delegate

    想继续了解请移步 View-Layer 协作

    参考

    记录园子里的一篇有关CALayer与UIView的关系
    详解 CALayer 和 UIView 的区别和联系

  • 相关阅读:
    ubuntu 如何 su 到 root(作为 root 用户操作)
    centos6.5 redis 安装配置及java调用
    springmvc 国际化
    springmvc 整合数据验证框架 jsr
    springmvc 整合shiro
    centos 6.5 安装mysql
    hive 报错 java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
    centos 关闭防火墙
    client.HConnectionManager$HConnectionImplementation: Can't get connection to ZooKeeper: KeeperErrorCode = ConnectionLoss for /hbase
    fms +fme 视频直播
  • 原文地址:https://www.cnblogs.com/chenyg32/p/5185619.html
Copyright © 2020-2023  润新知