文档章节

iOS核心动画笔记1-图层的树状结构

hell03W
 hell03W
发布于 2016/07/30 13:44
字数 1162
阅读 52
收藏 0

从今天开始, 准备系统的学习一下iOS中的核心动画了, 准备花一个月时间, 利用空闲时间把所有章节内容都看完, demo都敲完, 每个章节的笔记就记在这里了, demo记在github上. 我认为的重点我会提取出来到这里记下来.

电子教程是在极客学院上的这个: http://wiki.jikexueyuan.com/project/ios-core-animation/coating-tree.html

dmeo在我的github上:

图层的树状结构

Core Animation, 顾名思义, 就是核心动画, 很容易让人误解是一个专门用来做动画的框架, 其实不然. 动画只是 Core Animation 众多功能中的冰山一角.

1. 图层和视图

在iOS中, 所有的视图都是从一个叫UIView的基类派生而来的, UIView可以处理触摸事件, 可以支持Core Graphics绘图, 放射变换, 滑动挥着渐变的动画.

CALayer:

CALayer在概念上和UIView类似, 也可以像UIView一样, 在layer上添加或者移除subLayer, 也可以包含一些图片, 文本背景颜色等内容, 也有一些方法和属性做动画, 它和UIView最大的不同是, CALyer不能处理用户的交互.CALayer并不清楚响应者链, 所以它不能够响应事件.

UIView:

每个UIView都有一个对应的平行层级的CALayer属性,视图的职责其实是管理这个图层, 实际上, 这些背后关联的图层才是真正用来在屏幕上显示和做动画的, UIView只是对它的一个封装, 提供了一些iOS类似于出没处理的具体功能, 以及CoreAnimation底层方法的高级接口(clipsToBounds, transform等).

为什么要同时维持UIView和CALayer两个层级?

简单的说, 职责分明. Objective-C语言开发需要同时支持iOS开发和mac OS开发. 而在iOS和macOS中事件处理方式是不同的, 各种操作习惯也是不同的, iOS中是基于触摸屏幕的, Mac OS中是基于鼠标点击事件的, 所以在iOS中我们使用UIView这个视图, 而macOS中使用NSView这个视图. 而用来真正显示内容的CALayer单独列为一个新的层级, 好处就是可以在两个平台共享代码, 两个平台都使用CALayer图层, 但是上层的封装划分为UIView与NSView即可. 这样, 不管是苹果自己开发团队还是第三方其他开发团队, 都可以节约很多的时间成本.

2. 图层能用来做什么

CALayer是UIView的内部实现细节, 但是我们还是有必要去了解这个细节. 如果是简单的需求, 我们只需要使用UIView这样的高级视图即可, UIView的高级API间接的使用CALayer的相关功能, 会让开发更加简单, 但是如果想做一点改变, 做一点点与众不同的东西, 就必须借助CALayer图层了.

UIView没有暴露出来的CALayer功能:

  • 阴影效果, 圆角效果, 带颜色的边框
  • 3D变换
  • 非矩形的范围
  • 透明遮罩层
  • 多级非线性动画

3. 使用图层

首先我们需要知道, CALayer被包含在 <QuartzCore/QuartzCore.h>框架中.

默认情况下, 一个视图只有一个相关联的图层, 同时也可以支持添加无数个子图层, 如果需要添加子图层, 我们可以显式创建一个单独的图层, 并且添加到视图关联的子图层中.

使用CALayer的好处:

  • 可以用来开发Macros OS和iOS挂平台的应用.
  • 使用一些特殊的Layer, 有很多CALayer的子类, 用来专门处理不同的视图展示.
  • 对性能特别挑剔, 或者特别注重性能的应用.

4. UIView中, 层级关系是用过Layer维系在一起的

以下代码证明: UIView中的层级关系是通过CALayer图层来关联在一起的. 就是说, 向view上面添加一个子view, 相当于在view的layer图层上添加了子view的layer图层.

    
    // 创建一个view, 并添加到self.view上面
    UIView *layerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [self.view addSubview:layerView];
    layerView.center = self.view.center;
    layerView.backgroundColor = [UIColor lightGrayColor];
    NSLog(@"%ld", layerView.layer.sublayers.count); /// result: 0
    
    
    // 创建一个子view. 并将之添加到 layerView上面
    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)];
    [layerView addSubview:subView];
    subView.backgroundColor = [UIColor redColor];
    NSLog(@"%ld", layerView.layer.sublayers.count); /// result: 1
    
    
    // 创建CALayer对象, 直接添加到layerView.layer图层上
    CALayer *blueLayer = [CALayer layer];
    [layerView.layer addSublayer:blueLayer];
    blueLayer.backgroundColor = [UIColor blueColor].CGColor;
    blueLayer.frame = CGRectMake(30, 30, 30, 30);
    NSLog(@"%ld", layerView.layer.sublayers.count); /// result: 2

© 著作权归作者所有

共有 人打赏支持
hell03W
粉丝 9
博文 145
码字总数 109892
作品 0
朝阳
程序员
私信 提问
GPU vs CPU in iOS

一直以来,我们做产品的时候并没有特别的去考虑CPU/GPU的使用,最近为了提升可视化功能的性能,发现合理使用GPU也是一个可以好好研究的部分,这里总结一下一些有用的信息。 中央处理器 CPU ...

雨_树
07/10
0
0
iOS开发系列--让你的应用“动”起来

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/47753223 --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动...

KenshinCui
2015/08/18
0
0
iOS项目框架架构模式(MVC、MVVM、MVCS、VIPER的选择)

联系人:石虎 QQ:1224614774昵称: 嗡嘛呢叭咪哄 QQ群:807236138群称: iOS 技术交流学习群 一、概念 没有最好的架构,只有适合自己的业务的架构才是最好的架构,并且它是逐步地变强变大。 架构...

石虎132
09/12
0
0
iOS动画开发之四——核心动画编程(CoreAnimation)

iOS动画开发之四——核心动画编程(CoreAnimation) 一、引言 前几篇博客详细介绍了有关UIView层的动画使用与相关的效果,然而这些动画是UIKit为我们封装好的核心动画层的方法,通过这些方法,...

珲少
2015/07/28
0
0
UIView Animations 学习笔记(一)简介及API说明

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animation 学习笔记 应用示例 一、简介 随着iOS7的发布,动画与运动效果变成了Apple和第三方开发者进行app设计的中心。iOS7介绍...

灰大羊
2015/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java.util.Concurrent.Semaphore 源码

类图 源码: package java.util.concurrent;import java.util.Collection;import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class Semaphore implements ja......

狼王黄师傅
31分钟前
2
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
4
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
1
0
使用 React 和 Vue 创建相同的应用,他们有什么差异?

在工作中应用 Vue 之后,我对它有了相当深刻的理解。 不过,俗话说「外国的月亮比较圆」,我好奇「外国的」 React 是怎么样的。 我阅读了 React 文档并观看了一些教程视频,虽然它们很棒,但...

阿K1225
昨天
4
0
2天闭门培训|以太坊智能合约从入门到实战(北京)

2天培训 16个课时 探寻技术原理,精通以太坊智能合约开发 以太坊智能合约是现在应用的最广泛的区块链应用开发方式,HiBlock区块链社区针对以太坊智能合约的学习特别推出2天闭门研修班,通过2...

HiBlock
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部