CALayer入门

2024-06-24 10:58
文章标签 入门 calayer

本文主要是介绍CALayer入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

iOS开发UI篇—CALayer简介
一、简单介绍

在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。

其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层

@property(nonatomic,readonly,retain) CALayer *layer; 

当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示

换句话说,UIView本身不具备显示的功能,拥有显示功能的是它内部的图层。

 

二、简单使用

  UIView之所以能够显示,完全是因为内部的CALayer对象。因此,通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色等。

  新建一个项目,在storyboard中添加一个view.

 

  1.通过layer设置边框的宽度和颜色

复制代码
 1 #import "YYViewController.h"
 2 
 3 @interface YYViewController ()
 4 @property (weak, nonatomic) IBOutlet UIView *customView;
 5 
 6 @end
 7 
 8 @implementation YYViewController
 9 
10 - (void)viewDidLoad
11 {
12     [super viewDidLoad];
13     //设置边框的宽度为20
14     self.customView.layer.borderWidth=20;
15     //设置边框的颜色
16     self.customView.layer.borderColor=[UIColor greenColor].CGColor;
17 }
18 
19 @end
复制代码

  

2.通过layer设置边框为圆角

1     //设置layer的圆角
2     self.customView.layer.cornerRadius=20;

3.在layer上添加一张图片 

复制代码
 1 #import "YYViewController.h"
 2 
 3 @interface YYViewController ()
 4 @property (weak, nonatomic) IBOutlet UIView *customView;
 5 
 6 @end
 7 
 8 @implementation YYViewController
 9 
10 - (void)viewDidLoad
11 {
12     [super viewDidLoad];
13     //设置边框的宽度为20
14     self.customView.layer.borderWidth=5;
15     //设置边框的颜色
16     self.customView.layer.borderColor=[UIColor blackColor].CGColor;
17     
18     //设置layer的圆角
19     self.customView.layer.cornerRadius=20;
20     
21     //在view的图层上添加一个image,contents表示接受内容
22     self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
23     
24 }
25 @end
复制代码

说明:contents是id类型,可以接受内容,上面的实例让layer显示一张图片,仔细观察可以发现四个圆角的部分露了一个角出来。

产生的原因说明:

               

customview上的根layer

  

UIimage的图层

   

添加后

那是因为设置的image不是展示在主图层上的,而是显示在子图层上的。可以通过设置一个范围,设置超出主图层的部分把它给剪切掉。

有以下两种方法,建议使用layer中的方法(第二种)self.customView.layer.masksToBounds=YES;

复制代码
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     //设置边框的宽度为20
 5     self.customView.layer.borderWidth=5;
 6     //设置边框的颜色
 7     self.customView.layer.borderColor=[UIColor blackColor].CGColor;
 8     
 9     //设置layer的圆角
10     self.customView.layer.cornerRadius=20;
11     //设置超过子图层的部分裁减掉
12     //UI框架中使用的方法
13 //    self.customView.clipsToBounds=YES;
14     self.customView.layer.masksToBounds=YES;
15     
16     //在view的图层上添加一个image,contents表示接受内容
17     self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
18 }
复制代码

注意:layer中不能直接接受UI框架中的东西

   4.设置阴影

  设置阴影,不光需要设置阴影颜色,还应该设置阴影的偏移位和透明度。

  因为如果不设置偏移位的话,那么阴影和layer完全重叠,且默认透明度为0(即完全透明)。

复制代码
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     
 5     //设置阴影的颜色
 6     self.customView.layer.shadowColor=[UIColor blackColor].CGColor;
 7     //设置阴影的偏移量,如果为正数,则代表为往右边偏移
 8     self.customView.layer.shadowOffset=CGSizeMake(15, 5);
 9     //设置阴影的透明度(0~1之间,0表示完全透明)
10     self.customView.layer.shadowOpacity=0.6;
11 }
复制代码

补充说明:如果设置了超过主图层的部分减掉,则设置阴影不会有显示效果。

复制代码
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     
 5     //设置边框的宽度为20
 6     self.customView.layer.borderWidth=5;
 7     //设置边框的颜色
 8     self.customView.layer.borderColor=[UIColor blackColor].CGColor;
 9     
10     //设置layer的圆角
11     self.customView.layer.cornerRadius=20;
12     //设置超过子图层的部分裁减掉
13     //UI框架中使用的方法
14     //    self.customView.clipsToBounds=YES;
15     self.customView.layer.masksToBounds=YES;
16     
17     //在view的图层上添加一个image,contents表示接受内容
18     self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
19     
20     //设置阴影的颜色
21     self.customView.layer.shadowColor=[UIColor blackColor].CGColor;
22     //设置阴影的偏移量,如果为正数,则代表为往右边偏移
23     self.customView.layer.shadowOffset=CGSizeMake(15, 5);
24     //设置阴影的透明度(0~1之间,0表示完全透明)
25     self.customView.layer.shadowOpacity=0.6;
26 }
复制代码

  

把剪切超出主图层部分的代码注释掉之后的显示效果

复制代码
 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     
 5     //设置边框的宽度为20
 6     self.customView.layer.borderWidth=5;
 7     //设置边框的颜色
 8     self.customView.layer.borderColor=[UIColor blackColor].CGColor;
 9     
10     //设置layer的圆角
11     self.customView.layer.cornerRadius=20;
12     //设置超过子图层的部分裁减掉
13     //UI框架中使用的方法
14     //    self.customView.clipsToBounds=YES;
15 //    self.customView.layer.masksToBounds=YES;
16     
17     //在view的图层上添加一个image,contents表示接受内容
18     self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
19     
20     //设置阴影的颜色
21     self.customView.layer.shadowColor=[UIColor blackColor].CGColor;
22     //设置阴影的偏移量,如果为正数,则代表为往右边偏移
23     self.customView.layer.shadowOffset=CGSizeMake(15, 5);
24     //设置阴影的透明度(0~1之间,0表示完全透明)
25     self.customView.layer.shadowOpacity=0.6;
26 }
复制代码

5.只要继承自uiview的都有layer属性,下面以图片为例进行说明。

在storyboard中新添加一张图片。

简单设置示例

复制代码
 1 #import "YYViewController.h"
 2 
 3 @interface YYViewController ()
 4 @property (weak, nonatomic) IBOutlet UIView *customView;
 5 @property (weak, nonatomic) IBOutlet UIImageView *iconView;
 6 
 7 @end
 8 
 9 @implementation YYViewController
10 
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14     
15     //设置图片layer的边框宽度和颜色
16     self.iconView.layer.borderColor=[UIColor brownColor].CGColor;
17     self.iconView.layer.borderWidth=5;
18     
19     //设置layer的圆角
20     self.iconView.layer.cornerRadius=20;
21     //设置超过子图层的部分裁减掉
22        self.iconView.layer.masksToBounds=YES;
23 }
复制代码

设置bounds属性,在设置时需要去除掉storyboard中的自动布局属性。

       

设置图片的形变属性(transform)

复制代码
 1 @implementation YYViewController
 2 
 3 - (void)viewDidLoad
 4 {
 5     [super viewDidLoad];
 6 }
 7 
 8 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 9 {
10 
11     //通过uiview设置(2D效果)
12 //    self.iconView.transform=CGAffineTransformMakeTranslation(0, -100);
13     //通过layer来设置(3D效果,x,y,z三个方向)
14     self.iconView.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
15 }
复制代码
通过uiview设置(2D效果)
       
通过layer设置(3D效果)
       
使用KVC进行设置
复制代码
 1 #import "YYViewController.h"
 2 
 3 @interface YYViewController ()
 4 @property (weak, nonatomic) IBOutlet UIView *customView;
 5 @property (weak, nonatomic) IBOutlet UIImageView *iconView;
 6 
 7 @end
 8 
 9 @implementation YYViewController
10 
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14 }
15 
16 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
17 {
18 
19     //通过uiview设置(2D效果)
20 //    self.iconView.transform=CGAffineTransformMakeTranslation(0, -100);
21     //通过layer来设置(3D效果,x,y,z三个方向)
22 //    self.iconView.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
23     
24     //通过KVC来设置
25     NSValue *v=[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(100, 20, 0)];
26     [self.iconView.layer setValue:v forKeyPath:@"transform"];
27     //如果是只需要设置在某一个方向上的移动,可以参考下面的代码
28     //在x的方向上向左移动100
29     [self.iconView.layer setValue:@(-100) forKeyPath:@"transform.translation.x"];
30 }
复制代码

查看苹果的官方文档,下面的属性都可以通过KVC进行设置。

旋转一个弧度

复制代码
 1 @implementation YYViewController
 2 
 3 - (void)viewDidLoad
 4 {
 5     [super viewDidLoad];
 6 }
 7 
 8 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 9 {
10 
11     //通过uiview设置(2D效果)
12 //    self.iconView.transform=CGAffineTransformMakeTranslation(0, -100);
13     //通过layer来设置(3D效果,x,y,z三个方向)
14 //    self.iconView.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
15     
16     //通过KVC来设置
17 //    NSValue *v=[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(100, 20, 0)];
18 //    [self.iconView.layer setValue:v forKeyPath:@"transform"];
19 //    //如果是只需要设置在某一个方向上的移动,可以参考下面的代码
20 //    //在x的方向上向左移动100
21 //    [self.iconView.layer setValue:@(-100) forKeyPath:@"transform.translation.x"];
22     
23     //旋转
24     self.iconView.layer.transform=CATransform3DMakeRotation(M_PI_4, 1, 1, 0.5);
25 }
复制代码

补充:三维坐标系

这篇关于CALayer入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089954

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是