zoukankan      html  css  js  c++  java
  • CALayer和UIView

    前言


    本次分享将从以下方面进行展开:

    1. 曾被面试官问倒过的问题:层与视图的关系
    2. CALayer类介绍及层与视图的关系
    3. CAShapeLayer类介绍
    4. UIBezierPath贝塞尔曲线讲解
    5. CoreAnimation之动画子类介绍
    6. CATransitionAnimation类实现各种过滤动画

    关于Core AnimationiOS系统中的关系图如下:


    image

    可以看出,Core Animation是相对上层的封装,介于UIKitCore GraphicsOpenGL/OpenGL ES之间。最底下还有一个Graphics Hardware,就是硬件了!!!

    层与视图的关系


    我们先看看WindowLayer之间的关系:

    image

     

    这个图告诉我们,层是基于绘画模型实现的,层并不会在我们的app中做什么事,实际上是层只是捕获app所提供的内容,并缓存成bitmap,当任何与层关联的属性值发生变化时,Core Animation就会将新的bitmap传给绘图硬件,并根据新的位图更新显示。

    UIViewiOS系统中界面元素的基础,所有的界面元素都是继承自UIView。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如framebounds等,实际上内部都是在访问它所包含的CALayer的相关属性。

    提示:layer-based drawing不同于view-based drawing,后者的性能消耗是很高的,它是在主线程上直接通过CPU完成的,而且通常是在-drawRect:中绘制动画。

    UIView与CALayer的联系

    我们看看UIViewlayer之间的关系图:

    image

    我们可以看到,一个UIView默认就包含一个layer属性,而layer是可以包含sublayer的,因此形成了图层树。从此图可以看出这两者的关系:视图包含一个layer属性且这个layer属性可以包含很多个sublayer

    有人说UIView就像一个画板,而layer就像画布,一个画板上可以有很多块画布,但是画布不能有画板。

    UIView与CALayer的主要区别

    1. UIView是可以响应事件的,但是CALayer不能响应事件
    2. UIView主要负责管理内容,而CALayer主要负责渲染和呈现。如果没有CALayer,我们是看不到内容的。
    3. CALayer维护着三个layer tree,分别是presentLayer TreemodeLayer TreeRender Tree,在做动画的时候,我们修改动画的属性,其实是修改presentLayer的属性值,而最终展示在界面上的其实是提供UIViewmodelLayer

    官方说明了UIViewCALayer的联系:

    Layers are not a replacement for your app’s views—that is, you cannot create a visual interface based solely on layer objects. Layers provide infrastructure for your views. Specifically, layers make it easier and more efficient to draw and animate the contents of views and maintain high frame rates while doing so. However, there are many things that layers do not do. Layers do not handle events, draw content, participate in the responder chain, or do many other things. For this reason, every app must still have one or more views to handle those kinds of interactions.

    说说CALayer


    我们首先得明确LayeriOS系统上的坐标系起点是在左上角的,而在OS X系统上是左下角的:

     

    image

    笔者对Layer相关的属性和方法画了这么一张图:

    image

    看看官方关于Layer Tree的说明:

    image

    Core Animation介绍


    我们在开发中常见的动画:

    image

    笔者将Core Animation的关系图及相关属性、方法说明都通过该图来表达:

    image

    如果我们要改变动画的行为,我们可以实现CAAction协议的方法,像这样:

  • 相关阅读:
    Android自动化框架学习中遇到的方法
    Python中使用adb命令行
    monkeyrunner无法运行的问题解决方案总结
    TCP与UDP的区别
    KVM虚拟机的认知
    HTTP状态码分类
    FTP主动模式(Port)和被动模式(Passive)的区别
    Linux df -h 显示磁盘空间满,但实际未占用满——问题分析
    浅谈AD域
    zabbix连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
  • 原文地址:https://www.cnblogs.com/jiayongqiang/p/5339678.html
Copyright © 2011-2022 走看看