博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS核心动画笔记1-图层的树状结构
阅读量:7251 次
发布时间:2019-06-29

本文共 2569 字,大约阅读时间需要 8 分钟。

hot3.png

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

电子教程是在极客学院上的这个:

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

转载于:https://my.oschina.net/whforever/blog/724005

你可能感兴趣的文章
2019年自动驾驶5大趋势预测:第一台Level 5 无人车问世
查看>>
后APP时代的破局之路 :阿里技术“三大容器五大方案”亮相,百川开放全面升级...
查看>>
工欲善其事-必先利其器之终端
查看>>
64位的Mac OS X也有Windows.Forms了
查看>>
立下“去O”Flag的AWS,悄悄修炼了哪些内功?
查看>>
Better Software East/DevOps East/Agile Dev East 2016大会上的教程介绍
查看>>
优酷在多模态内容理解上的研究及应用
查看>>
JavaScript学习笔记整理:对象篇
查看>>
GitHub的bug赏金计划升级:奖金提高到3万美元以上
查看>>
中国法院裁定:禁售部分型号苹果手机
查看>>
使用实体框架、Dapper和Chain的仓储模式实现策略
查看>>
HTTP/2推送之难,远超想象
查看>>
与Bob McWhirter的问答:WildFly Swarm更名为Thorntail项目
查看>>
新书问答:Agile Management
查看>>
在sublime中实现代码检测
查看>>
活在伟大的Scrum团队是什么感觉
查看>>
Swift 5进入发布倒计时
查看>>
一套代码称霸5大端口,移动金融应用还能这样开发?
查看>>
MIT开发Polaris,使网页载入加快34%
查看>>
微软对macOS和Linux开放量子开发工具集
查看>>