`

UIView 和 CALayer的那点事

 
阅读更多

UIView 和 CALayer的那点事

(1)老祖

万物归根,UIView和CALayer都是的老祖都是NSObjet。

 

1: UIView的继承结构为: UIResponder : NSObject

 

可以看出UIView的直接父类为UIResponder , UIResponder gsm的呢?

官方的解释:

The UIResponder class defines an interface for objects that respond to and handle events. It is the superclass of UIApplication, UIView and its subclasses (which include UIWindow). Instances of these classes are sometimes referred to as responder objects or, simply, responders.

 

The UIView class defines a rectangular area on the screen and the interfaces for managing the content in that area. At runtime, a view object handles the rendering of any content in its area and also handles any interactions with that content. The UIView class itself provides basic behavior for filling its rectangular area with a background color. More sophisticated content can be presented by subclassing UIView and implementing the necessary drawing and event-handling code yourself. The UIKit framework also includes a set of standard subclasses that range from simple buttons to complex tables and can be used as-is. For example, a UILabel object draws a text string and a UIImageView object draws an image.

 

可见 UIResponder是用来响应事件的,也就是UIView可以响应用户事件。

 

2:CALayer的继承结构为: NSObject

 

直接从 NSObject继承,因为缺少了UIResponder类,所以CALayer悲催的不能响应任何用户事件。

 

The CALayer class is the model class for layer-tree objects. It encapsulates the position, size, and transform of a layer, which defines its coordinate system. It also encapsulates the duration and pacing of a layer and its animations by adopting the CAMediaTiming protocol, which defines a layer’s time space.

 

从官方的解释可以看出,CALayer定义了position、size、transform、animations 等基本属性。那UIView的size、frame、position这些属性是从那里来的呢?上面的官方解释没有说明这一点,我们一会再分析

 

至此我们了解到了,UIView CALayer的基本信息和主要负责处理的事情。

 

(2)所属框架

1:UIView是在 /System/Library/Frameworks/UIKit.framework中定义的。

这个又是做什么的呢?

The UIKit framework provides the classes needed to construct and manage an application’s user interface for iOS. It provides an application object, event handling, drawing model, windows, views, and controls specifically designed for a touch screen interface.

 

可见UIKit主要是用来构建用户界面,并且是可以响应事件的(得意与UIView的父类UIResponder,至于UIResponderd的实现原理不是这次分析的目的,在此不做过多的解释

 

在这里思考一个问题UIView既然是构建用户界面的,那他是通过什么方式绘制这些图片、文字之类的信息的呢? 

 

Ios中的2D图像绘制都是通过QuartzCore.framework实现的。难道是通过QuartzCore.framework实现的?那又是通过什么方式和QuartzCore.framework联系起来的呢??我们一会再看。

 

2:CALayer是在/System/Library/Frameworks/QuartzCore.framework定义的。而且CALayer作为一个低级的,可以承载绘制内容的底层对象出现在该框架中。

 

 

现在比较一下uiview和calayer都可以显示图片文字等信息。难道apple提供了,两套绘图机制吗?不会。

UIView相比CALayer最大区别是UIView可以响应用户事件,而CALayer不可以。UIView侧重于对显示内容的管理,CALayer侧重于对内容的绘制。

大家都知道QuartzCore是IOS中提供图像绘制的基础库。并且CALayer是定义该框架中。难道UIView的底层实现是CALayer??

 

官方做出了明确的解释:

Displaying Layers in Views

Core Animation doesn't provide a means for actually displaying layers in a window, they must be hosted by a view. When paired with a view, the view must provide event-handling for the underlying layers, while the layers provide display of the content.

The view system in iOS is built directly on top of Core Animation layers. Every instance of UIView automatically creates an instance of a CALayer class and sets it as the value of the view’s layer property. You can add sublayers to the view’s layer as needed.

On Mac OS X you must configure an NSView instance in such a way that it can host a layer.

 

由此可见UIView是基于CALayer的高层封装。The view system in iOS is built directly on top of Core Animation layers. 

 

UIView 的方法:

layerClass - Implement this method only if you want your view to use a different Core Animation layer for its backing store. For example, if you are using OpenGL ES to do your drawing, you would want to override this method and return the CAEAGLLayer class.

该方法保留了UIView的本质。即对UIView所管理的内容,任何显示也是受到CALayer的影响的。

 

  1. (3)相似支持

1:相似的树形结构

2:显示内容绘制方式

3: 布局约束


  1. (4) UIView 是什么,做什么

UIView是用来显示内容的,可以处理用户事件


  1. (5)CALayer是什么,做什么

CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。


  1. (6)为何有两套结构

并不是两套体系,UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。

 

  1. (7)两者之间的关系

发之于肤,血之于肉,灵之于魄,男人之于肾的关系。依存的关系

 

结论:

UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。

 

 

分享到:
评论
3 楼 wwwqqqiang 2013-07-10  
喜欢楼主分享问题的方式,有思想
2 楼 huanghuihong123456 2013-05-24  
赞楼主一个
1 楼 0118 2013-01-01  
写得很不错  学习到了很多知识

相关推荐

    CALayer-AutoresizingMask:为 iOS CALayer 添加 UIViewAutoresize 支持和快速 UIView 到 CALayer 的转换方法

    为 iOS CALayer 添加 UIViewAutoresize 支持和快速 UIView 到 CALayer 的转换方法 安装 pod 'CALayer-AutoresizingMask' 用法 不要在这个storyboard或XIB使用自动布局,并使用您需要的自动调整大小蒙版。 热交换...

    UI相关面试题1

    本文主要讲解了UI相关的面试题,涵盖了UIView和CALayer、事件传递与视图响应链、图像显示原理、UI卡顿掉帧原因、滑动优化方案、UI绘制原理和离屏渲染等知识点。 一、UIView与CALayer UIView和CALayer是iOS UI编程...

    motion-animator-objc:Motion Animator根据运动规范创建高性能,可中断的iOS动画

    适用于iOS 9+的动画师,结合了现代UIView和CALayer动画API的最佳方面。 :party_popper: 隐式和显式加性动画。 :party_popper: 通过参数化运动。 :party_popper: 直接从手势识别器为动画提供速度。 :party_popper: ...

    CALayer基本使用

    在UIKit中,UIView和CALayer之间存在对应关系。每个UIView都有一个默认的Layer,通过`layer`属性访问。你可以自定义View的Layer属性,如设置阴影、圆角等,这些改变会影响到与其关联的View。 **8. 性能优化** 由于...

    CALayer的基本使用demo

    `CALayer`有很多属性可以控制它的外观和行为,比如`frame`定义了层的位置和大小,`backgroundColor`设置背景颜色,`borderWidth`和`borderColor`用于设置边框宽度和颜色,`contents`可以设置层的内容,如图片或颜色...

    CALayer的使用

    在iOS开发中,CALayer是Core Animation框架的核心组件,它负责在屏幕上绘制和动画化视觉内容。`CALayer`是一个轻量级的对象,用于管理视图的几何形状、内容、透明度以及各种视觉效果。本篇文章将深入探讨`CALayer`的...

    iOS开发中CALayer使用的基本教程

    CALayer是UIView背后的绘图引擎,尽管我们通常与UIView交互,但真正的图形渲染和动画处理都在其对应的CALayer上进行。 **一、CALayer的基本概念** 1. **UIView与CALayer的关系**: - UIView是iOS界面元素的基础,...

    iOS开发中CAlayer层的属性以及自定义层的方法

    在iOS开发中,CAlayer是UIKit框架中的核心部分,它是UI视图的基础,负责处理图形渲染和动画。本文将深入探讨CAlayer的两个关键属性:`position`和`anchorPoint`,以及如何利用它们来调整视图的布局和动画效果。同时...

    ios中关于uiview

    以下是对标题和描述中涉及的`UIView`知识点的详细解释: 1. **Bounds和Frame的区别** - `bounds`表示视图自身的坐标系统,它定义了视图内容的边界,不随视图在父视图中的位置变化而变化。`bounds`的原点始终是(0, ...

    ios-自定义CALayer.zip

    在iOS开发中,CALayer是UI层的核心组件,它负责绘制和动画的实现。自定义CALayer能够让我们根据特定需求创建独特的视觉效果。本示例中的"ios-自定义CALayer.zip"是一个教学项目,旨在指导开发者如何通过自定义...

    IOS软件开发ObjectiveCUIView动画和CALayer动画.ppt

    在iOS软件开发中,Objective-C提供了两种主要的动画机制:UIView动画和CALayer动画。这两种动画方式虽然都可以实现丰富的视觉效果,但它们有着不同的特性和使用场景。 首先,让我们了解`UIView`动画。UIView动画是...

    swift-ZMCALayerAnimationiOS绘图和动画

    5. **UIView与CALayer的关系**:虽然UIView和CALayer有明显的区别,但它们之间有紧密的联系。每个UIView都有一个关联的CALayer,视图的许多属性和方法最终会映射到图层上。通过直接操作图层,可以实现一些在UIView...

    CALayer 图层处理

    在iOS和macOS开发中,`CALayer`是Core Animation框架的核心组成部分,它负责图形的渲染和动画。`CALayer`对象是不透明的矩形区域,可以包含内容、边框、阴影等视觉元素,是构建用户界面的基础。这篇内容我们将深入...

    ios-优雅的实现CALayer的"AutoLayout"的两种方案.zip

    在iOS开发中,我们经常需要对视图进行布局...第一种方法利用了`UIView`的AutoLayout能力,而第二种方法则通过自定义`CALayer`子类直接处理布局逻辑。这两种方法都有其适用场景,开发者可以根据项目需求选择合适的方法。

    iOS CALayer 思维导图

    CALayer和UIView紧密相关,一个UIView可以包含一个或多个CALayer。iOS CALayer思维导图涵盖了许多与CALayer相关的知识点,下面我们将详细解读这些知识点。 首先,CALayer可以利用矢量图形而非bitmap来绘制,开发者...

    iOS实现UIView渐变效果

    接着,通过设置其frame属性,我们可以指定渐变层在UIView中的位置和大小。最后,将这个CAGradientLayer作为UIView的layer.contents,即可将渐变效果应用到UIView上。 对于描述中提到的“已封装好的实现渐变的UIView...

    iOS 面试从简单到复杂

    #### 一、UIWindow、UIView与CALayer的关系及区别 1. **UIWindow**:UIWindow是UIView的子类,主要功能包括: - 提供一个区域来显示UIView。 - 将事件(Event)分发给UIView。 - 一般情况下,一个应用程序只有一...

    iOS CoreAnimation 图层几何学

    `center`属性在UIView和CALayer中看似表示图层的中心点,但实际上在CALayer中,`position`才是更直接控制图层中心点的位置。在UIView中,center和position的作用相似,但在CALayer中,他们代表不同的概念:center在...

    用CALayer.Mask(遮罩)实现iphone图标的水晶立体效果

    CALayer是Core Animation框架的基础,它是UIView的底层渲染层。通过直接操作CALayer,开发者可以实现更高效、更灵活的界面动画和图形设计。 接着,我们来讨论Mask(遮罩)。CALayer的mask属性可以用来定义其显示...

    iOS中UIView的翻页动画demo

    这个框架提供了CALayer类,它是UIView的底层表示,支持直接对层进行动画操作。为了实现翻页效果,我们需要对两个UIView(代表页面)进行动画处理,模拟页面的物理运动,如重力、摩擦力和弹性。 首先,我们需要了解...

Global site tag (gtag.js) - Google Analytics