Core Animation - 图层几何学<一>

简介: Core Animation - 图层几何学<一>

我们知道图层也好,视图也罢,我们在使用时,它总是以某一形状出现,这便是图层的几何,这里我来简单说下图层几何这一章的学习过程。


1.布局


在UIView中有frame,bounds和center,而在CALayer中有frame,bounds和position,他们是一一相对的,bounds和center(position)决定了frame,所以frame是一个虚拟的东西,是由后两者算出来的,他们彼此相互依赖,只要改变了bounds或者center(position)中的任何一个值,frame 就会被改变,需要注意的是,对图层进行变换,特别是旋转的时候,frame的值随时都在变化,为四个角做垂直切线形成的新的矩形区域,最初的“frame”则是小于并存在于新的frame里面的。

image.png

image.png

这里借用书中的图来说明frame变化这一现象。


2.锚(mao)点(抛锚的mao)


锚点(anchorPoint)位于图层的中心,默认为{0.5,0.5},图层左上角为{0,0},右下角为{1,1},它的作用是用于保持平衡,我们把锚点比作一个跷跷板的支点,当把锚点向一侧移动时,另一边肯定由于重心偏离支点而向锚点移动的相反的方向倾斜,就是这个原理,当改变图层的锚点时,图层总是向对称的相反的方向移动锚点变化的距离。

image.png

image.png

如图所示,锚点就是这么的神奇。这里有一个时钟表针位置的变化,因为书中的内容相对来说老了点,所以代码在现在的Xcode中运行是有问题的,尤其需要注意这几段代码:

 //定义一个遵循某个历法的日历对象
    NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
//通过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置需要表示哪些信息
NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:[NSDate date]];
float hoursAngle=(dateComponents.hour%12*1.0/12)*M_PI*2+dateComponents.minute*1.0/60.0*(M_PI/6);
float minutesAngle=(dateComponents.minute*1.0/60)*M_PI*2;
float secondsAngle=(dateComponents.second*1.0/60)*M_PI*2;

旧的方法Xcode会报错,这里博主用了新的方法,同时,不知道什么原因,下面这段代码

CGFloat hoursAngle = (components.hour / 12.0) * M_PI * 2.0;
//calculate hour hand angle //calculate minute hand angle
CGFloat minsAngle = (components.minute / 60.0) * M_PI * 2.0;
//calculate second hand angle
CGFloat secsAngle = (components.second / 60.0) * M_PI * 2.0;

这么写是有问题的,因为components.hour这些参数是%i的类型,%i实际上就是%d了,除以一个整数得到的还是一个整数,时钟是不会动的,所以这里要变成一个浮点数,乘以1.0就可以了,类似的还有在下载时算下载文件大小的ll(大写LL)类型,直接进行运算都是会出问题的,需要乘以1.0,再进行运算,书中的方法还有一个缺陷就是时针一直指向整数小时,所以这里博主利用分针的位置改进了下代码。博主在学习时自己找乐资源做了下,代码下载代码地址:这里写链接内容,大家自己尝试。

目录
相关文章
|
NoSQL Redis
若依管理系统去掉Redis相关配置
若依管理系统去掉Redis相关配置
|
机器学习/深度学习 算法 数据挖掘
马尔科夫链(Markov Chain, MC)算法详解及Python实现
马尔科夫链(Markov Chain, MC)算法详解及Python实现
10972 115
马尔科夫链(Markov Chain, MC)算法详解及Python实现
|
前端开发 应用服务中间件 nginx
使用Docker快速搭建Web服务器Nginx
本文指导如何使用Docker快速搭建Nginx服务器。首先,通过`docker pull`命令获取Nginx镜像,然后以容器形式运行Nginx并映射端口。通过挂载目录实现本地文件与容器共享,便于自定义网页。使用`docker ps`检查运行状态,访问IP:8088确认部署成功。最后,介绍了停止、删除Nginx容器的命令,强调Docker简化了服务器部署和管理。
|
6月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
274 16
|
9月前
|
存储 人工智能 算法
打通海量数据,精准挖掘潜在客户
在当今商业环境中,智能拓客技术正深刻变革客户关系管理(CRM)行业。通过大数据、人工智能和云计算,智能拓客系统能够精准挖掘潜在客户,提升销售全流程管理效率。相比传统手动方式,智能拓客大幅提高了获客精度与效率,助力企业实现业务快速增长。以房产中介和金融行业为例,智能拓客显著提升了客户获取量和业务拓展速度,成为企业在激烈市场竞争中的核心竞争力。
|
JavaScript
vue2中左侧菜单和头部tab标签联动
vue2中左侧菜单和头部tab标签联动
533 0
|
开发工具 Android开发 git
解决Idea报错出现Git is not installed
解决Idea报错出现Git is not installed
4565 2
idea svn 文件夹颜色级联改变
idea svn 文件夹颜色级联改变
265 0
|
Linux Python Windows
【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
139 0
|
负载均衡 NoSQL Java
redis7.0源码阅读(四):Redis中的IO多线程(线程池)
redis7.0源码阅读(四):Redis中的IO多线程(线程池)
374 0