一.iOS核心动画 - 关于图层与视图

引言

Core Animation听起来会让人误以为它只是用来做动画的,但是事实上它是从Layer Kit库演变而来的,其中做动画的功能只是Core Animation特性的一小部分。

Core Animation是一个复核引起,它的作用就是尽可能快地组合屏幕上不同的显示内容,这些内容被分解成独立的图层,存在一个叫做图层树的体系当中。于是这个树形成了UIKit以及在iOS应用程序当中你所能在屏幕看见的一切的基础。

介绍

在日常开发中我们对视图的概念已经比较熟悉了。一个视图就是显示在屏幕上的一个矩形块,它可以拦截点击触摸等用户输入的事件。视图在层级关系中可以嵌套,一个视图可以管理它的所有子视图的位置。

我们创建一个非常简单例子来说明视图的层级关系,代码如下:

        let view = UIView(frame: CGRect(x: 100, y: 100, width: 150, height: 150))
        view.backgroundColor = .red
        self.view.addSubview(view)
        
        let subGreenView = UIView(frame: CGRect(x: 25, y: 10, width: 50, height: 50))
        subGreenView.backgroundColor = .green
        view.addSubview(subGreenView)
        
        let subBlueView = UIView(frame: CGRect(x: 25, y: 75, width: 50, height: 50))
        subBlueView.backgroundColor = .blue
        view.addSubview(subBlueView)

视图显示如下,两个subView嵌套在红色view当中:

在iOS当中,所有的视图都从UIView这个基类派生出来的,UIView可以处理触摸事件,可以支持基于Core Graphics绘图,可以做仿射变换,或者简单的滑动渐变的动画。

图层CALayer在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以用于显示图片文本或者背景颜色,同样也可以管理子图层的位置。它和UIView最大的不同就是CALayer不处理用户的交互。

UIView和CALayer的层级关系

每一个UIView都有一个CALayer实例图层,视图的职责就是创建和管理这个图层,以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作。

事实上这些图层CALayer才是真正用来在屏幕上显示和做动画的,UIView仅仅是对它进行了封装,并提供了可以处理用户交互的能力。

但是为什么会这样设计呢?为什么会提供两个平行的层级关系呢?

原因就在于要做职责分离,这样也可以避免许多重复代码。在iOS和Mac OS两个平台上,事件和用户交互有很多地方不同,基于多点触控的用户界面和基于鼠标键盘有着本质的区别。

绘图,布局和动画,相比之下就是类似Mac笔记本和桌面系列一样应用于iPhone和iPad触屏的概念。把这种功能的逻辑分开并应用到独立的Core Animation框架,苹果就能够在iOS和Mac OS之间共享代码,使得对苹果自己的OS开发团队和第三方开发者去开发两个平台的应用更加便捷。

图层的作用

下面我们来全面的了解一下CALayer,苹果虽然为我们提供了一些优美简洁的UIView接口,可以让我们间接地使用,让动画变得简单了许多。但是这种简单就不可避免地带来了一些灵活上的缺陷。如果你想实现一些UIView为实现的接口功能,就不得不更加全面的了解和使用Core Animation。

下面列举一些视图不具备,属于图层的特有功能:

  • 阴影,圆角,带颜色的边框
  • 3D变换
  • 非矩形图像
  • 遮罩
  • 多级非线性动画

图层的使用

我们来创建一个非常简单的项目,一共包含两个图层,一个白色的CALayer,一个红色的CALayer,代码如下。

            //白色
        let whiteLayer = CALayer()
        whiteLayer.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
        whiteLayer.backgroundColor = UIColor.white.cgColor
        view.layer.addSublayer(whiteLayer)
        
        // 红色
        let redLayer = CALayer()
        redLayer.frame = CGRect(x: 30, y: 30, width: 40, height: 40)
        redLayer.backgroundColor = UIColor.red.cgColor
        whiteLayer.addSublayer(redLayer)

显示如下:

我们在白色图层上面添加了一个红色图层,当然还可以添加更多的图层,同样我们还可以在红色的图层上也添加更多的图层,这样就会形成一个树状的结构,通常就是我们常说的图层树。

总结

本篇博客主要阐述了图层的树状结构,并且自己创了CALayer并把它添加到了图层树中。

通过上面的介绍我们已经对Core Animation框架的基础有了初步的了解,下面的博客我们介绍到与图层相关联的图片,已经Core Animation提供的操作显示的一些特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698308.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】getters

除了state之外,有时我们还需要从state中筛选出符合条件的一些数据,这些数据是依赖state的,此时会用到getters getters就类似于属性中的计算属性 这个getter只有获取,如果需要设置修改,还是需要经过mutations getters里…

实验四、零比特插入《计算机网络》

但凡这句话有一点用的话也不至于一点用都没有。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握零比特插入原理及方法使用任意编程语言实现零比特插入方法。 二、实验内容 掌握零比特插入原理及方法 点对点协议 PPP(Point-to-Point Protoco…

8.11 矢量图层线要素单一符号使用六(光栅线)

文章目录 前言光栅线(Raster Line)QGis设置线符号为光栅线(Raster Line)二次开发代码实现光栅线(Raster Line) 总结 前言 本章介绍矢量图层线要素单一符号中光栅线(Raster Line)的使…

Navicat导入json文件(json文件数据导入到MySQL表中)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Threejs-05、设置响应式画布与全屏控制。

1、自适应屏幕大小 你会发现,我们前面写好的代码,在页面尺寸发生改变的时候,并不能自适应的改变尺寸,而出现空白或者滚动条突出的情况。所以监听屏幕大小的改变,来重新设置相机的宽高比例和渲染器的尺寸大小,代码如下: // 监听画面变化,更新渲染画面 window.addEven…

删除的东西怎么恢复?5个方法,找回误删数据!

“我刚刚一不小心在电脑上误删了一些数据,想问问大家有什么方法可以恢复删除的东西吗?请帮帮我!” 在数据时代,我们每天会在电脑上保存很多重要的数据,这些数据不仅包括我们的学习资料、工作信息,还有各种个…

DeepSORT(目标跟踪算法)中自由度决定卡方分布的形状

DeepSORT(目标跟踪算法)中自由度决定卡方分布的形状 flyfish 重要的两个点 自由度决定卡方分布的形状(本文) 马氏距离的平方在多维正态分布下服从自由度为 k 的卡方分布 独立的信息 在统计学中,独立的信息是指数据…

震撼!AI语言模型突破瓶颈,26个提示词原则引领GPT-4响应质量飙升57.7%!你的模型还在等什么?

不是模型不够强大,是你的提示不够精准。 当大型语言模型如ChatGPT在各领域大放异彩时,普通用户却对其指令设计一头雾水。这篇论文揭秘了与模型交流的秘诀,仅凭优化提示,就让GPT-4响应质量和准确性分别飙升57.7%和36.4%&#xff0…

重生奇迹mu套装掉的地点一览

1、目前只有三个地方掉套装:赤色要塞,不是100%掉,靠运气。卡利玛7,杀困顿能掉。魔炼之地,只有城主盟成员可以进入。 2、只有攻城城主盟可以进入的地图“魔炼之地”掉套装,暴率几乎为0。如果你是敏法的话&am…

C++ 判断目标文件是否被占用(独占)(附源码)

在IM软件中发起文件发送时,如果要发送的是某word文件,并且该word文件被office打开,则会提示文件正在被占用无法发送,如下所示: 那文件被占用到底是如何判断出来的呢?其实很简单,调用系统API函数CreateFile,打开该文件(OPEN_EXISTING),传入FILE_SHARE_READ共享读标记…

MySQL—多表查询—练习(2)

一、引言 接着上篇博客《 MySQL多表查询——练习(1)》继续完成剩下的案例需求。 二、案例 (0)三张表(员工表、部门表、薪资等级表) 员工表:emp 部门表:dept 薪资等级表:…

CF297C Splitting the Uniqueness 题解

CF297C Splitting the Uniqueness 题解 非常好构造题,使我的草稿纸旋转。 解法 我们记输入的数组为 a a a,需要输出的两个数组为 b , c b,c b,c(因为当时起变量名起的)。 考虑利用 a i a_i ai​ 互不相同的性质。 先将 a…

Kaggle -- Titanic - Machine Learning from Disaster

新手kaggle之旅:1 . 泰坦尼克号 使用一个简单的决策树进行模型构建,达到75.8%的准确率(有点低,但是刚开始) 完整代码如下: import pandas as pd import numpy as npdf pd.read_csv("train.csv&quo…

Spring Boot 分片上传、断点续传、大文件上传、秒传,应有尽有

文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,…

《Brave New Words 》5.1 传递真相:偏见和虚假信息现状

Part V: Keeping Kids Safe 第五部分:确保孩子安全 Never travel faster than your guardian angel can fly. —Mother Teresa 永远不要比你的守护天使飞得更快。 ——特蕾莎修女 Distrust and caution are the parents of security. —Benjamin Franklin 不信任和谨…

使用 actor-critic 方法来控制 CartPole-V0 游戏

CartPole 介绍 在一个光滑的轨道上有个推车,杆子垂直微置在推车上,随时有倒的风险。系统每次对推车施加向左或者向右的力,但我们的目标是让杆子保持直立。杆子保持直立的每个时间单位都会获得 1 的奖励。但是当杆子与垂直方向成 15 度以上的…

Java开发基础技能简介

一、Java版本 JavaSE:标准版 JavaEE:企业版 二、IDEA工程中的模块 1.打开工程所在文件夹 鼠标右键点模块——open in——explorer 2.修改模块名 鼠标右键点模块——refactor-rename-rename module and directory 3.导出模块 ctrl c,…

LLM系列:KVCache及优化方法

前言 Transformer encode-base模型,推理和训练过程高度统一(差异仅仅是否存在反向),而decoder-base模型(如GPT、LLama2),推理与训练差异性比较大: 自回归推理全量prompt增量tokenK…

公司电脑文件防泄密软件系统——天锐绿盾 | 透明加密、防泄密系统

天锐绿盾是一款专业的企业信息安全防护软件,旨在防止公司内部文件的泄露。它提供了多种功能来保护敏感数据,确保企业信息的安全。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾的主…

[Java基础揉碎]网络相关概念

目录 网络通信 网络 ip地址 ​编辑 域名 ​编辑 网络协议 TCP和UDP 网络编程比较重要的的InetAddress类 Socket ​编辑 tcp字节流编程 案例一 案例二​编辑 案例三 网络上传文件 ​编辑​编辑 ​编辑 netstat tcp网络通信客户端也是通过端口和服务端进行通讯的…