文档章节

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

hell03W
 hell03W
发布于 2016/07/30 13:44
字数 1162
阅读 45
收藏 0
点赞 0
评论 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
博文 143
码字总数 108663
作品 0
朝阳
程序员
GPU vs CPU in iOS

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

雨_树
07/10
0
0
UIView Animations 学习笔记(一)简介及API说明

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

灰大羊
2015/08/01
0
0
iOS动画开发之四——核心动画编程(CoreAnimation)

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

珲少
2015/07/28
0
0
UIView Animations 学习笔记(二)定制动画效果及切换效果

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animations 学习笔记(二)定制动画效果及切换效果 UIView Animation 学习笔记 应用示例 二、视图切换定制 2.1 基础说明 要创建...

灰大羊
2015/08/12
0
0
iOS开发系列--让你的应用“动”起来

概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画...

creeve
2014/10/26
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
iOS开发UI篇—核心动画(转场动画和组动画

iOS开发UI篇—核心动画(转场动画和组动画) 一、转场动画简单介绍 CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点 UINa...

caoxiang
2015/08/18
0
0
iOS开发之核心动画 高级技巧

今天在开发者头条看到了,看了几章,就停不下来了,各种细节都讲得很详细,无可挑剔! 另外,因为最近项目的时候,很多地方实现都要求加入动画,提高用户体验,刚好可以好好学习下。 主要目录...

神补刀
2015/08/06
0
0
使用 Skeleton Screen 提升用户感知体验

1024程序猿节“愿世界和平,没有bug”,腾讯云社区向改变世界的程序猿致敬! 作者:陈纬杰 一直以来,无论是web还是iOS、android的应用中,为了提升应用的加载等待这段时间的用户感知体验,各...

腾讯云加社区
2017/10/24
0
0
iOS一些代码的取巧写法总结(一)

一、 字典(NSDictionary)和JSON字符串(NSString)之间互转 二、打开摄像机作为背景 三、打开背光灯 四、状态栏和导航栏一些设置 五、切回app时、会有闪现、闪现一次主屏幕的现象 六、[UIAppl...

朝雨晚风
2016/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

217. Contains Duplicate - LeetCode

Question 217. Contains Duplicate Solution 题目大意:判断数组中是否有重复元素 思路:构造一个set,不重复就加进去,重复返回true,如果数据量大的话,可以用布隆过滤器 Java实现: publ...

yysue
7分钟前
0
0
istio 处理失败

Envoy提供了一套开箱即用的选择加入故障恢复功能,可以通过应用程序中的服务进行利用。功能包括: 超时 具有超时预算和重试之间的可变抖动的有界重试 限制并发连接数和对上游服务的请求 对负...

xiaomin0322
9分钟前
0
0
eclipse解决git冲突举例

本地修改了两个文件,提交时提示有冲突,想来应该是没有从远程仓库下载最新代码导致的。通过右击项目 -> Team -> Sychronized WorkSpace,比较本地仓库和远程仓库的异同:   此时没有更好的...

Code辉
17分钟前
0
0
运行.jar后缀的文件

前提必须安装了jdk,正确配置环境变量。 在dos窗口执行以下命令即可。 java -jar C:\Users\10492\Desktop\turn.jar

haha360
20分钟前
0
0
Java程序员如何做代码压力测试?【JWordPress前台项目实战】

代码 pom.xml文件引入包 <dependency><groupId>com.taobao.stresstester</groupId><artifactId>stresstester</artifactId><version>1.0</version></dependency> 编写测试代码 /**......

迷你芊宝宝
24分钟前
0
0
面试宝典-什么是缓存穿透?

缓存穿透是说收到了一个请求,但是该请求缓存里没有,只能去数据库里查询,然后放进缓存。 这里面有两个风险,一个是同时有好多请求访问同一个数据,然后业务系统把这些请求全发到了数据库;...

suyain
30分钟前
0
0
vue基础知识练习2

一、发送AJAX请求 <div id="demo1"><button @click="send">发送AJAX请求</button><button @click="sendGet">GET方式发送AJAX请求</button><button @click="sendPost">POST方式发送A......

一个yuanbeth
32分钟前
0
0
Xamarin Essentials教程磁力计Magnetometer

Xamarin Essentials教程磁力计Magnetometer 磁力计也叫地磁、磁感器,可用于测试磁场强度和方向。在手持设备中,通过磁力计可以计算设备的左右、前后倾斜角度,广泛应用于手机各种的应用中。...

大学霸
37分钟前
0
0
mesos:Authentication timed out

最近当slave开始慢慢部署异地集群的时候又碰上了这个问题 I0717 10:27:11.695762 28852 slave.cpp:895] New master detected at master@192.168.2.161:5050I0717 10:27:11.695811 28852 sl......

xueyi28
43分钟前
0
0
赋予用户库的读写权限

1、创建用户 CREATE USER 'test'@'%' IDENTIFIED BY '15ht46389012t'; #'%' - 所有情况都能访问;‘localhost’ - 本机才能访问;’192.168.1.2‘ - 指定 ip 才能访问 2、赋予权限 grant al...

xixingzhe
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部