【iOS】CALayer的理解与简单使用

文章目录

  • 前言
  • 一、UIView与CALayer的关系
  • 二、CALayer的简单使用
    • 1.圆角与裁剪
    • 2.contents
    • 3.边框属性
  • 总结


前言

在实现网易云音乐demo开发的过程中,通过查阅网上资料,发现了我们可以对我们的视图进行裁剪来实现美观的体现,例如这样:在这里插入图片描述

将原本矩形的视图裁剪成圆形,来更加贴合大众的审美,但是当查看视图层级时发现时视图似乎并未被裁减,但仍然显示出圆形的形状,经过查阅资料发现与视图创建时自带的图层CALayer有关

在这里插入图片描述

一、UIView与CALayer的关系

视图与图层是 iOS 应用程序中界面元素的两个关键概念,它们紧密相连并且密切合作。在 iOS 开发中,我们通常使用视图(UIView)来构建用户界面,而图层(CALayer)则是视图背后的实际绘制和渲染的基础。

  • 视图(UIView):
    视图是 iOS 应用程序中构建用户界面的基本元素。它们是 UIView 类的实例,是 UIKit 框架中的一部分。每个视图都是矩形区域,可以包含其他视图,并通过嵌套的方式形成视图层次结构。视图处理用户交互事件,响应触摸和手势,并可以添加动画和转换效果。
    视图是高级别的抽象,提供了方便的方法来管理界面元素,但是视图本身并不实际进行绘制和渲染。它的绘制和渲染工作是由对应的图层来完成的
  • 图层(CALayer):
    图层是视图背后的实际绘制和渲染引擎。每个视图都有一个关联的图层,可以通过 view.layer 属性访问。图层是 CALayer 类的实例,是 Core Animation 框架中的一部分。图层负责实际绘制视图的内容,并处理图形和动画效果。
    图层管理自己的内容,并且它可以包含其他子图层,形成图层树。图层提供了一组属性和方法,用于控制绘制、布局和动画等操作。使用图层,我们可以在视图上绘制图形、渐变、阴影等效果,以及应用动画和过渡效果。

简单来说,视图负责响应我们的操作,图层负责设计我们的UI

视图与图层之间的关系是一一对应的,每个视图都有一个关联的图层,它们共同构成了 iOS 应用程序的界面元素。视图是对图层的高级别封装,提供了更方便的界面管理功能,而图层是对视图绘制和渲染的实际执行者。

注意:视图的图层是由系统自动创建和管理的,一般情况下我们无需手动创建视图的图层。视图和图层之间的关系是一一对应的,每个视图都自带一个对应的图层,只是不在我们的层级上显示出来

二、CALayer的简单使用

我们先从CALayer的创建开始入手,我们知道UIView创建时会自动创建一个与之对应的CALayer,那么如果我们单独创建一个CALayer是否能够显示呢?给出代码我们试着运行一下
在这里插入图片描述
在这里插入图片描述

可以看到我们的CALayer成功显现了,我们来看一下我们的视图层级
在这里插入图片描述
发现其并没单独成为一个模块显示,这更能说明CALayer并不能响应我们的事件,而是用来绘制我们的视图


1.圆角与裁剪

在上面的代码中加入如下代码:在这里插入图片描述

在这里插入图片描述显示出的是一个圆形图案,这是因为我们是用了cornerRadius,用来裁减试图的角,它的中文意思是曲率,当为0时其为直角,通过对其进行变换可以用来裁减我们的视图。

曲率的出现常常伴随着masksToBounds,它的中文意思是裁减边框,只有我们将其设为yes,才可以允许我们的视图以CALayer为模型裁减我们的边框

我们回到我们最初的问题,如果我们视图的CALayer的masksToBounds为no(默认情况下为no),将不会出现裁减的效果,之所以我们上面的图形可以裁剪,是因为它本身就是被裁减后没有超出边框的部分,,我们需要裁减的是超出边框的部分,以下面代码为例,我们如果没有设置masksToBounds为yes
在这里插入图片描述
出现的就是一个矩形的效果
在这里插入图片描述
加上这段代码

在这里插入图片描述
就出现了我们需要的效果
实际上这个属性是用来裁减我们的子图层的,我们上面的头像实际上是UIButtom使用setimage方法后得到的,使用setimage方法时我们就自动将imageview作为一个子视图赋给buttom,因此可以理解为buttom的图层就是父图层,imageview 的图层就是子图层
在这里插入图片描述可以看到我实际上并没有点击到我的头像,而是点击到了图像之外的区域,但是按钮仍然响应,这也证明了我们的视图的大小是不变的,只是显示出来的部分被裁减了


基本代码原理:
NO:
在这里插入图片描述
在这里插入图片描述
Yes
在这里插入图片描述

masksToBounds: 这是 CALayer 类的属性,用于控制图层是否裁剪其子图层超出图层边界的部分。当设置为 YES 时,图层将会裁剪其子图层的内容,使其不会超出图层的边界范围。这与 UIView 中的 clipsToBounds 属性功能相同

2.contents

我们知道我们可以通过创建一个UIImageView,然后将其赋给我们的视图,来实现自定义背景图片,但是如果使用CALayer的contents属性,就不用那么麻烦
在这里插入图片描述
在这里插入图片描述
这里唯一需要注意的就是我们如果用image对齐进行赋值,编译可以通过,但是不会显现出图片,要使用其CGImage属性才会出现图片,用CALayer设置背景颜色也是如此,这里笔者还不是很理解,给出大佬的解释供大家理解

CALayer 有一个叫 contents 的属性,在 Mac OS 中,它对 CGImage 和 NSImage 类型的值都起到作用,但是在 iOS 中,你如果将 UIImage 的值赋于它,虽然可以通过编译,但是只能得到一个空白内容。不过好在 UIImage 有一个 CGImage 属性,它返回一个 “CGImageRef” 对象,它是一个 Core Foundation 类型,你需要使用 bridge 关键字将其转换为 Cocoa 类型


3.边框属性

这个属性在设计3GShare时用到了,他有宽度与背景颜色的设置
在这里插入图片描述
borderWidth用于设置边框宽度,borderColor用于设置颜色
呈现出来就是这样的效果

在这里插入图片描述

总结

事实上,CALayer还有很多属性,笔者还不甚理解,这里给出大佬的博客供大家参阅
iOS开发之CALayer
iOS CALayer介绍
iOS CALayer的理解与简单使用

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

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

相关文章

Vue--》打造个性化医疗服务的医院预约系统(三)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

C语言程序运行需要的两大环境《C语言进阶》

目录 程序的翻译环境和执行环境 翻译环境分为两部分,编译链接 第一步:预编译(预处理) 第二步,编译 第三步:汇编 关于运行环境分为四点: 关于链接库 程序的翻译环境和执行环境 在 ANSI C(标…

C语言第七课----------函数的定义及使用--------C语言重要一笔

作者前言 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________ 目录 1.函数是什么 2. 库函数 3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声…

海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储

文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131679108 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

物联网如何为智慧城市提供动力

智慧城市可以创造一个基础设施顺畅、效率提升的乌托邦,改善城市地区的生活质量,促进当地经济发展。 其影响意义重大,预计到 2024 年智慧城市基础设施的收入将超过 1000 亿美元。 从改善公共交通到解决犯罪问题和提高能源效率——应有尽有&am…

Fatdog64 Linux 814发布

导读Fatdog64 Linux是一个小型、桌面、64位的Linux发行版。 最初是作为Puppy Linux的衍生品,并增加了一些应用程序。该项目最新的版本,Fatdog64 814,是8xx系列的最后一个版本,未来的版本将转向9xx基础。 尽管它是该系列的最后一个…

【Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题,本文将稍作更改,以便能够顺利运行。 1 Ordered Bar Chart 有序条形图有效地传达项目的排名顺序。但是,将图表上方的指标值相加,用户将从图表本身获得准确的信息…

网络安全合规与标准的主要发展方向

网络安全合规就是避免违反网络安全有关的法律、法规、规章、合同义务以及任何安全要求,标准在网络安全合规工作中扮演着重要的角色。 一、标准在网络安全合规体系中的地位作用 网络安全合规体系包括网络安全有关的法律、法规、规章、其他规范性文件、及合同义务等…

[java安全]TemplatesImpl在Shiro550反序列化

文章目录 【java安全】TemplatesImpl在Shiro550反序列化Shiro的原理Shiro反序列化产生演示攻击过程payload使用key加密 构造不含数组的GadGets简单调用链 改造cc6为CommonsCollctionsShiro完整POC触发Shiro550漏洞进阶POC总结 【java安全】TemplatesImpl在Shiro550反序列化 Sh…

24.实现线性拟合和相关系数(matlab程序)

1.简述 1. 基本语法 1.1 corr函数基本语法 语法 说明 rho corr(X) 返回输入矩阵X中每对列之间的两两线性相关系数矩阵。 rho corr(X, Y) 返回输入矩阵X和Y中每对列之间的两两相关系数矩阵。 [rho, pval] corr(X, Y) 返回pval,一个p值矩阵&#xff0c…

OceanBase 压测时为什么冻结阈值在变化?

本文从源码角度分析了 OceanBase 压测中冻结阈值动态变化的原因,并给出运维建议。 作者:张乾 外星人2号,兼任五位喵星人的铲屎官。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不得随意使用,转…

Vue3组合式API+TypeScript写法入门

文章目录 前言1.reactive2.ref3.props4.computed5.emit6.watch总结 前言 参考Vue3官网. 本篇以组合式API为例, 但不包含setup语法糖式写法. 原本打算结合class-component, Vue3不推荐就不用了: OverView|Vue Class Component. 而且是不再推荐基于类的组件写法, 推荐单文件组件…

NetSuite ERP顾问的进阶之路

目录 1.修养篇 1.1“道”是什么?“器”是什么? 1.2 读书这件事儿 1.3 十年计划的力量 1.3.1 一日三省 1.3.2 顾问损益表 1.3.3 阶段课题 2.行为篇 2.1协作 2.2交流 2.3文档管理 2.4时间管理 3.成长篇 3.1概念能力 3.1.1顾问的知识结构 …

【idea】idea全局设置Maven配置

Idea版本:2021.1.1 1、点击File->Close project 2、点击Customize->All settings 3、设置Maven

Vue 项目增加版本号输出, 可用于验证是否更新成功

webpack 1. vue.config.js 中增加以下配置, 此处以增加一个日期时间字符串为例, 具体内容可以根据自己需求自定义 // vue.config.js module.exports {chainWebpack(config) {config.plugin(define).tap(args > {args[0][process.env].APP_VERSION ${JSON.stringify(new …

Vue中TodoLists案例_删除

与上一篇Vue中TodoList案例_勾选有三个文件变化了 App.vue&#xff1a;添加了一个deleteTodo根据id删除方法&#xff0c;传递给儿子组件MyList <template><div id"root"><div class"todo-container"><div class"todo-wrap"…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态&#xff0c;我们的愿景是&#xff1a;定义移动时代最佳体验&#xff0c;建设智能小程序行业标准&#xff0c;打破孤岛&#xff0c;共建开源、开放、繁荣的小程序行业生态。百度…

脑电信号处理与特征提取——三. 脑电实验设计的原理与实例(古若雷)

三、脑电实验设计的原理与实例 被试间设计的实验结果也有可能是人员不同造成的&#xff0c;所以建议被试内设计。

Web前端开发概述(二)

&#x1f60a;Web前端开发概述&#xff08;二&#xff09; &#x1f47b;前言&#x1fa81;前端开发背景&#x1f50d;当下前端开发要求&#x1f526;Web前端开发技术&#x1f3ad;HTML&#x1f3ad;CSS&#x1f3ad;JavaScript&#x1f3ad;HTML DOM&#x1f3ad;BOM&#x1f…

JVM面试题总结

一.请简述对象的创建过程 对象的new字节码执行指令如下图 首先0指令new出一片内存空间&#xff0c;然后进行对象的初始化&#xff0c;初始化完成前变量都是初始值如m0 然后创建连接&#xff0c;t指向对象。 二.DCL单例要不要加volatile&#xff1f; DCL单例就是要懒汉式从创建…