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 }
复制代码

补充:三维坐标系

目录
相关文章
|
5天前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计、性能优化以及市场覆盖等方面。通过对这些关键因素的比较分析,旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和目标受众做出明智的平台选择。
|
5天前
|
编解码 Android开发 iOS开发
深入探索Android与iOS开发的差异与挑战
【6月更文挑战第24天】在移动应用开发的广阔舞台上,Android和iOS两大操作系统扮演着主角。它们各自拥有独特的开发环境、工具集、用户基础及市场策略。本文将深度剖析这两个平台的开发差异,并探讨开发者面临的挑战,旨在为即将踏入或已在移动开发领域奋斗的开发者提供一份实用指南。
27 13
|
1天前
|
iOS开发 开发者 UED
探索iOS开发中的SwiftUI框架
【6月更文挑战第28天】在移动应用开发的海洋中,SwiftUI作为iOS平台的新星,以其声明式语法和灵活性,正引领着界面设计的未来。本文将带你深入理解SwiftUI的核心概念、布局能力以及如何通过它提升开发效率,为开发者们提供一份实操指南,解锁SwiftUI的强大潜力。
8 1
|
8天前
|
iOS开发 开发者 容器
探索iOS开发中的SwiftUI框架
【6月更文挑战第21天】本文深入探讨了苹果在iOS开发中推出的SwiftUI框架,旨在为开发者提供一种声明式、更简洁的界面设计方法。文章首先概述了SwiftUI的核心概念和优势,接着通过一个天气预报应用实例,详细讲解了如何使用SwiftUI进行布局和用户界面的设计。此外,还讨论了SwiftUI与UIKit的差异,以及如何将SwiftUI集成到现有的项目中。最后,文章展望了SwiftUI的未来发展方向,包括潜在的改进和新特性。
|
4天前
|
监控 Android开发 iOS开发
探索Android与iOS开发的差异:平台、工具和用户体验的比较
【6月更文挑战第25天】在移动应用开发的广阔天地中,Android和iOS两大平台各领风骚,它们在开发环境、工具选择及用户体验设计上展现出独特的风貌。本文将深入探讨这两个操作系统在技术实现、市场定位和用户交互方面的关键差异,旨在为开发者提供一个全景式的视图,帮助他们在面对项目决策时能够更加明智地选择适合自己项目需求的平台。
|
8天前
|
Java 开发工具 Android开发
安卓与iOS开发差异解析
【6月更文挑战第21天】本文旨在深入探讨安卓和iOS两大移动操作系统在应用开发过程中的主要差异。通过对比分析,揭示各自的设计哲学、编程语言选择、用户界面构建、性能优化策略以及发布流程的异同。文章将提供开发者视角下的实用信息,帮助他们更好地理解各自平台的特点和挑战,从而做出更明智的开发决策。
|
2天前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
3天前
|
机器学习/深度学习 移动开发 文字识别
视觉智能开放平台产品使用合集之h5页面使用人脸活体检测,是否需要自己开发UI
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
3天前
|
缓存 C语言 iOS开发
一篇文章讲明白iOS开发系列
一篇文章讲明白iOS开发系列
|
4天前
|
设计模式 IDE Swift
探索iOS开发:从新手到专家的旅程
【6月更文挑战第25天】在数字时代的浪潮中,iOS开发作为一门艺术和科学的结合体,吸引了众多开发者的目光。本文将带领读者踏上一场精彩的旅程,从基础的搭建环境开始,逐步深入到高级编程技巧,再到应用发布与市场策略,全方位解读iOS开发的魅力所在。通过实际案例分析,我们将揭示那些让应用脱颖而出的秘密,以及如何在竞争激烈的应用市场中保持竞争力。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,让你的iOS开发之旅更加顺畅。