当前位置: 首页 > 编程日记 > 正文

iOS学习——核心动画之Layer基础

iOS学习——核心动画之Layer基础

1、CALayer是什么?

CALayer我们又称它叫做层在每个UIView内部都有一个layer这样一个属性UIView之所以能够显示就是因为它里面有这个layer才具有显示的功能我们可以通过操作CALayer对象可以很方便地调整UIView的一些外观属性可以给UIView设置阴影,圆角,边框等等... 

2、如何操作layer改变UIView外观?

  2.1 设置阴影

//默认图层是有阴影的, 只不过,是透明的
_RedView.layer.shadowOpacity = 1;//设置阴影的圆角
_RedView.layer.shadowRadius  =10;//设置阴影的颜色,把UIKit转换成CoreGraphics框架,用.CG开头
_RedView.layer.shadowColor = [UIColor blueColor].CGColor;

    2.2.设置边框

//设置图层边框,在图层中使用CoreGraphics的CGColorRef
_RedView.layer.borderColor = [UIColor whiteColor].CGColor;_RedView.layer.borderWidth = 2;

2.3.设置圆角

//图层的圆角半径,圆角半径为宽度的一半, 就是一个圆
_RedView.layer.cornerRadius = 50;

3、如何操作layer改变UIImageView的外观?

//设置图形边框
_imageView.layer.borderWidth = 2;
_imageView.layer.borderColor = [UIColor whiteColor].CGColor;//设置图片的圆角半径,必须要进行第二步的裁剪,超出裁剪区域的部分全部裁剪掉
_imageView.layer.cornerRadius = 50;
_imageView.layer.masksToBounds = YES; 

    注意设置图片的圆角时,除了设置圆角半径,还必须要进行第二步的裁剪,设置masksToBounds为yes这是因为UIImageView当中Image并不是直接添加在层上面的,这是添加在layer当中的contents里。UIImageView中是UIView的主layer上添加了一个次layer(用来绘制contents),我们设置边框的是主layer,但是次layer在上变,不会有任何的影响,所以当我们调用切割语句的时候,超出边框意外的都被切割了!!

    我们设置层的所有属性它只作用在层上面对contents里面的东西并不起作用所以如果我们不进行裁剪,我们看不到图片圆角效果的。想要让图片有圆角的效果,就必须把masksToBounds这个属性设为YES当设为YES把就会把超过根层以外的东西都给裁剪掉 

4、layer的 CATransform3D属性变换      

  UIView和Layer都有transform属性,但是他们的所属有区别,类型也有区别

1.picView.transform是二维的属性,是CGAffineTransform类型
2.picView.layer.transform是layer级别的三维属性,是CATransform3D类型的,当然也可以做二维的事情,只有旋转的时候才可以看出3D的效果.

//旋转  x,y,z 分别代表x,y,z轴.
CATransform3DMakeRotation(M_PI, 1, 0, 0);//平移
CATransform3DMakeTranslation(x,y,z)//缩放
CATransform3DMakeScale(x,y,z);

  属性设置有三种方法

//1.直接使用基本的三维赋值方法
picView.layer.transform = CATransform3DMakeScale(1, 2.5, 0);//2.使用KVC将CATransform3DMakeScale生成的对象给layer
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[picView.layer setValue:value forKeyPath:@"transform.scale"];//3.使用快捷方法设置属性
[picView.layer setValue:@5 forKeyPath: "transform.scale.y"];

      什么时候用KVC?

      当需要做一些快速缩放,平移,二维的旋转时用KVC。后面forKeyPath属性值不是乱写的,苹果文档当中给了相关的属性.

      比如: [_imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];

5、如何自定义Layer ?

  自定义CALayer的方式创建UIView的方式非常相似

//创建
CALayer *layer = [CALayer layer];
//设置尺寸和位置
layer.frame = CGRectMake(50, 50, 100, 100);
//设置背景
layer.backgroundColor = [UIColor redColor].CGColor;
//给layer设置图片.
layer.contents = (id)[UIImage imageNamed:@"image001"].CGImage;
//加载绘制
[self.view.layer addSublayer:layer];

  6、为什么要使用CGImageRef、CGColorRef?

    为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

  7、UIView和CALayer都能够显示东西,该怎样选择?

  在明白要怎么选择之前,我们先了解一下UIView和layer的不同点:

    • 在iOS中看的见,摸得着的都是UIView,例如一个按钮,UITextField,UILable等等,都是UIView
    • UIView之所以能够显示在屏幕上,是试音UIView中有一个图层
    • 在创建UIView的时候,系统会自动创建一个CALayer在其中,用于显示东西,可以通过view.layer来去获取图层属性
    • 当UIView要去显示的时候,先去调用drawRect方法,将要绘制的东西绘制到图层上,然后拷贝图层,完成了UIView的显示
    • UIView只有交互的功能,没有显示的功能
    • CALayer只要显示的功能,没有交互的功能
    • UIView可以做一些简单的动画,例如:平移,拉伸,旋转
    • 一些比较高端的动画,都是直接操作CALayer的,可以制作3D动画
    • 使用CALayer,可以直接操作显示的东西,例如阴影,圆角,边框等

所以,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以

如果显示出来的东西需要跟用户进行交互的话,用UIView;

  如果不需要跟用户进行交互,用UIView或者CALayer都可以CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级

8、position和anchorPoint?

  position和anchorPoint是CAlayer的两个属性我们以前修改一个控件的位置都是过Frame的方式进行修改现在CALayer则是通过position和anchorPoint属性也能够修改控件的位置

这两个属性是配合使用的

  position:它是用来设置当前的layer在父控件当中的位置的默认它的坐标原点以父控件的左上角为(0.0)点

  anchorPoint就是把锚点定到position所指的位置。它是决点CALayer身上哪一个点会在position属性所指的位置anchorPoint它是以当前的layer左上角为原点(0.0)它的取值范围是0~1,它的默认在中间也就是(0.5,0.5)的位置

  两者结合使用想要修改某个控件的位置我们可以设置它的position点设置完毕后layer身上的anchorPoint会自动定到position所在的位置

//下面两行代码就是设置views的 正中间 坐标(200,200)
_views.layer.position = CGPointMake(200, 200);
_views.layer.anchorPoint = CGPointMake(0.5, 0.5);//下面两行代码就是设置views的 左上角 坐标(200,200)
_views.layer.position = CGPointMake(200, 200);
_views.layer.anchorPoint = CGPointMake(0, 0);//下面两行代码就是设置views的 右下角 坐标(200,200)
_views.layer.position = CGPointMake(200, 200);
_views.layer.anchorPoint = CGPointMake(1, 1);

9、隐式动画

9.1 什么是隐式动画?

了解什么是隐式动画要先了解是什么根层和非根层

    • 根层UIView内部自动关联着的那个layer我们称它是根层.
    • 非根层自己手动创建的层称为非根层.

隐式动画就是当对非根层的部分属性进行修改时, 它会自动的产生一些动画的效果我们称这个默认产生的动画为隐式动画.

9.2 如何取消隐式动画?

首先要了解动画底层是怎么做的动画的底层是包装成一个事务来进行的

什么是事务? 很多操作绑定在一起当这些操作执行完毕后才去执行下一个操作.

//开启事务
[CATransaction begin];//设置事务没有动画
[CATransaction setDisableActions:YES];//设置动画执行的时长
[CATransaction setAnimationDuration:2];//提交事务
[CATransaction commit];

10、时钟效果

10.1 搭建界面

  界面上时针分针秒针不需要与用户进行交互所以都可以使用layer方式来做具体时间可以用用一张圆形图片来显示,然后在这个imageView的layer中进行时针、分针和秒针的绘制。

  做之前要观察时针在做什么效果是根据当前的时间绕着表盘的中心点进行旋转.

  要了解一个非常重要的知识点无论是旋转缩放它都是绕着锚点进行的。要想让时针分针称针显示的中间还要绕着中心点进行旋转那就要设置它的position和anchorPoint两个属性.

//添加秒针
- (void)addSecond{//创建秒针CALayer *layer = [CALayer layer];_secondL = layer;//设置宽高layer.bounds = CGRectMake(0, 0, 1, 80);//设置锚点为秒针的 x轴中心,y轴最右端,该锚点的位置是时钟图片的正中心layer.anchorPoint = CGPointMake(0.5, 1);layer.position = CGPointMake(_clockView.bounds.size.width * 0.5, _clockView.bounds.size.height * 0.5);//设置秒针的颜色layer.backgroundColor = [UIColor redColor].CGColor;//将秒针的layer添加到时钟图片的layer中
    [_clockView.layer addSublayer:layer];}//时针、分针的添加方式类似,只是设置的宽高有点区别,不再贴出来

10.2 让秒针开始旋转.  

//角度转换成弧度
#define angle2Rad(angle) ((angle) / 180.0 * M_PI)//每一秒 秒针 旋转6度
#define perSecondA 6
//每一分 分针 旋转
#define perMinA 6
//每一小时 时针 旋转30
#define perHourA 30
//第一分钟 时针 旋转0.5
#define perMinHour 0.5//每一秒调用一次
- (void)timeChage{NSCalendar *calendar = [NSCalendar currentCalendar];//components日历单元:年,月,日,时,分,秒//fromDate:从哪个时间开始取NSDateComponents *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];//获取当前时间的时 分 秒NSInteger curSecond =  cmp.second;NSInteger curMinute =  cmp.minute;NSInteger curHour = cmp.hour;//秒针 旋转多少度. 当前的秒数乘以每秒转多少度.CGFloat angle = curSecond * perSecondA;self.secondL.transform = CATransform3DMakeRotation(angle2Rad(angle), 0, 0, 1);//分针 旋转多少度. 当前的分钟乘以每分转多少度.CGFloat minuteA = curMinute * perMinA;self.minuteL.transform =  CATransform3DMakeRotation(angle2Rad(minuteA), 0, 0, 1);//时针旋转的度数应该是 多少小时对应的度数+分钟对应的时针旋转的度数CGFloat hourA = curHour * perHourA + curMinute * perMinHour;self.hourL.transform =  CATransform3DMakeRotation(angle2Rad(hourA), 0, 0, 1);
}

10.3 将布局和旋转进行组合

每过一秒,我们的秒针就需要变化位置,所以我们我们需要设置一个定时器,在开始时每秒执行一次旋转布局绘制。

- (void)viewDidLoad {[super viewDidLoad];//添加时针 分针 秒针
    [self addHour];[self addMinue];[self addSecond];//添加定时器,每秒进行绘制[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChage) userInfo:nil repeats:YES];//绘制
    [self timeChage];}

        

  

转载于:https://www.cnblogs.com/mukekeheart/p/9371508.html

相关文章:

linux valgrind memCheck ---内存检查工具的可视化方法valkyrie

linux valgrind memCheck —内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1、安装valgrind valgrind 安装 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind2、安装valkyrie valkyrie下载连接: https://launchpad.net/ubuntu/…

屏幕为什么要正负压供电_负压变换器的设计

目前在工业、汽车电子系统中有诸如温度、压力、位置、重量和流量等物理参数的精确测量,这些信号中的一些传感器和前置放大器需要正负电压源驱动或供电,以提供足够宽的动态范围和抗干扰性。这些电子系统通常使用3.3V、5V、12V或24V中的某一电压的直流电源…

DataCleaner 3.1.1 发布,数据质量分析管理

DataCleaner 3.1.1 扩展了日期和时间相关的分析;增加周、月、年的分布分析;数值分析和日期时间分析增加了描述统计的选项;新增用于生成 UUID 和时间戳的转换器等等。 DataCleaner 是一个数据质量分析,比较,验证和监督的…

IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上)...

IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上) 在前两篇文章中,我们已经讲述如何配置与安装ARR,从本篇文章开始,我们将重点的来讲述如何在使用ARR进行负载均衡。 本…

云主机启动提示Booting from Hard Disk GRUB

版本:Openstack ocata 系统:centos7.3 环境:VMware workstation12 解决方法: 或者 转载于:https://www.cnblogs.com/fcing/p/9374855.html

函数 tostring_Kotlin实战之Fuel的高阶函数

Fuel 是一个用 Kotlin 写的网络库,与 OkHttp 相比较,它的代码结构比较简单,但是它的巧妙之处在于充分利用了 Kotlin 的语言特性,所以代码看上去干净利落。OkHttp 使用了一个 interceptor chain 来实现拦截器的串联调用&#xff0c…

linux valgrind 安装和使用

linux valgrind 安装和使用 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind Valgrind 是个开源的工具,功能很多。例如检查内存泄漏工具—memcheck。 Valgrind 安装: sudo apt-get install valgrind Valgrind 命令介绍&#xff…

UIPopoverController在ARC环境下用法注意

在ARC环境下如果便用以下代码: [cpp] view plaincopyprint?UIViewController *viewTwo; viewTwo [[ViewTwo alloc] initWithNibName:"ViewTwo" bundle:nil]; UIPopoverController *popover; popover [[UIPopoverController alloc] initWithConten…

CPLD的分频语言

分频器在FPGA/CPLD设计中是不可缺少的一部分,这就包括分频系数是奇数和偶数的(我们称为奇分频和偶分频),而对于偶分频来说还有不同的分频方法,下面将给出具体的方法: 1、占空比不为50%的偶分频 占空比&…

彻底解决web开发中遇到的路径问题(上)

注:本文部分引用了网络上的文章,以及动力节点老师的讲解内容,感谢老师,嘻嘻。 为了举例方便,我新建了pathTest项目: 关于tomcat的配置,eclipse访问项目的路径一般是localhost:8080/projectName,…

关于Page翻页效果--Page View Controller

Page View Controllers你使用一个page view controller用page by page的方式来展示内容。一个page view controller管理一个self-contained视图架构。这个架构的父视图由page View controller管理,并且子视图由你提供的view Controllers管理。一,解析Pag…

linux平台下QtCreator中集成Valgrind系列工具

linux平台下QtCreator中集成Valgrind系列工具 ###1、valgrind 安装 valgrind 安装 2、打开QtCreator >> Analyze 你就会发现 这里已经有valgrind的相关选项了 如果没有的话, 在help >> about plugin >> C 中勾选 如图: 点击则可以直接运行…

python输入参数改变图形_Python基于Tensor FLow的图像处理操作详解

本文实例讲述了Python基于Tensor FLow的图像处理操作。分享给大家供大家参考,具体如下:在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数据进行处理使其变成一张新的…

CSS层叠样式

为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此思想而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠样式表。有了CSS,html中大部分表现样式的标签就废弃不用了,htm…

windows下 Source Monitor代码度量工具的使用

windows下 Source Monitor代码度量工具的使用 引用链接: https://www.cnblogs.com/xuehanyu/p/4520965.html 1.总体介绍 SourceMonitor是一款免费的软件,运行在Windows平台下。它可对多种语言写就的代码进行度量,包括C、C、C#、Java、VB、Delphi和HT…

MVVM 数据绑定

一、在 XAML 中创建绑定 定义源对象。 C# public class Dog {public string DogName { get; set; } }在 XAML 中创建对源对象的命名空间的引用。 XAML <UserControl x:Class"BindingXAML.Page" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pres…

linux配置文件怎么把某行后几个字符替换_vim(Linux运维)

一、vim使用介绍 介绍在linux系统中&#xff0c;大部分配置文件都是ASCII的纯文本形式存放的&#xff0c;所以我们在修改系统设置的时候使用简单的文本编辑软件就可以实现了&#xff0c;如果你使用过windows当中的word的话&#xff0c;那么你可能会感觉linux字符界面的文本编辑…

Debian 6.0 安装过程 及中文乱码

2019独角兽企业重金招聘Python工程师标准>>> Debian 6.0 安装过程 Debian 6.0 安装过程 转(一个别人自录的安装过程录相) http://v.youku.com/v_show/id_XMjUyMzY1OTIw.html 转(别人写的一个过程) http://hi.baidu.com/ljx_freebsd/blog/item/88d60c09da379da22edd…

git 提交丢失Warning, you are leaving 2 commits behind,

早上在自己的一个版本代码上编辑&#xff0c;提交commint&#xff0c;但是checkout到其他分支再checkout回来发现该的东西不见了&#xff0c; 幸好terminal还没有关掉&#xff0c;回看日志&#xff1a; Warning: you are leaving 2 commits behind, not connected toany of you…

一台支持vlan管理的交换机_关于交换机的VLAN技术你了解多少?

VLAN&#xff08;虚拟局域网&#xff09;是对连接到的第二层交换机端口的网络用户的逻辑分段&#xff0c;不受网络用户的物理位置限制而根据用户需求进行网络分段。一个VLAN可以在一个交换机或者跨交换机实现。VLAN可以根据网络用户的位置、作用、部门或者根据网络用户所使用的…

需要反射时使用dynamic

//使用dynamic的写法 dynamic fileExplorerData _currentFolder.FileExplorerData; var data fileExplorerData.InsertFromPath(newPath);//使用反射的写法 MethodInfo InsertMethod _currentFolder.FileExplorerData.GetType().GetMethod("InsertFromPath"); var…

Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy

Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy 原文连接: https://blog.csdn.net/wsj18808050/article/details/79824619 内容&#xff1a; QtCreator在前几天发布了4.6.0的版本&#xff0c;增加了两个非常棒的新功能&#xff0c;分别是Clang-Tidy和Clazy 官方…

JAVA swing初级教程(四)

附加的swing小部件(下) JOptionPane JOptionPane 是在 Swing 中类似“快捷方式”的东西。通常&#xff0c;作为 UI 开发人员&#xff0c;您需要向用户呈现快速信息&#xff0c;让用户了解错误和信息。甚至可能想得到一些快速数据&#xff0c;例如名称或数字。在 Swing 中&#…

Akka源码分析-Remote-发消息

上一篇博客我们介绍了remote模式下Actor的创建&#xff0c;其实与local的创建并没有太大区别&#xff0c;一般情况下还是使用LocalActorRef创建了Actor。那么发消息是否意味着也是相同的呢&#xff1f; 既然actorOf还是委托给了LocalActorRef&#xff0c;那么在本地创建的Actor…

用sed 给文本文件加行号

看例子&#xff1a; [rootlocalhost tmp]# sed test.txt 1 tsttst tsttsttst 2 west gao 3 west abces [rootlocalhost tmp]# sed test.txt | sed N;s/\n/\t/ 1 tsttst tsttsttst 2 west gao 3 west abces [rootlocalhost tmp]# N的解释&#xff1a; N&am…

Qt 编译一直死循环问题

Qt 编译一直死循环问题 有时候Qt编译项目时&#xff0c; 一直编不过&#xff0c;查看一下编译窗口&#xff0c;发现一直在循环 输出如下: C:\soft\Qt5.11\5.11.1\mingw53_32\bin\qmake.exe -o Makefile ..\..\..\..\PalmQtLib\PalmQtLib\PalmQtLib.pro -spec win32-g "…

路由器运行python脚本_写个Python脚本来登录小米路由器

这个脚本写起来难度并不是很大&#xff0c;博主还是一步步的分析下&#xff0c;这样思路会比较清晰&#xff0c;下次遇到类似系统脚本写起来也更快速。好了&#xff0c;一起来分析分析。首先看下小米路由器的登录界面可以看到只需要输入密码即可登录&#xff0c;博主这里为了演…

PHP定时执行任务的实现

2019独角兽企业重金招聘Python工程师标准>>> ignore_user_abort();//关掉浏览器&#xff0c;PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $interval60*30;// 每隔半小时运行 do{//这里是你要执行的代码 sleep($i…

Spring事务管理 与 SpringAOP

1&#xff0c;Spring事务的核心接口 Spring事务管理的实现有许多细节&#xff0c;如果对整个接口框架有个大体了解会非常有利于我们理解事务&#xff0c;下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略。   Spring事务管理涉及的接口的联系如下&#xff1a; 1.…

iso镜像文件烧写到U盘

iso镜像文件烧写到U盘 windows rufus-3.1.exe 百度云盘链接&#xff1a;https://pan.baidu.com/s/16p1O4lXMVTUltTvCm0DnHA 提取码&#xff1a;inzj 文件格式一般选择默认的就行,如果起不来,就换一个, linux 1、dd命令 2、系统自带 usb-creator-gtk工具 命令行输入&#x…