十八.核心动画 - 使用CAGradientLayer图层构建渐变视图

news2024/12/25 2:35:19

引言

在现代的UI设计中,渐变色和圆角已经成为了不可或缺的元素。无论是应用程序的背景,按钮,还是图标,这些设计趋势不仅使界面更加美观,还能提升用户体验。特别是渐变色,它通过颜色的平滑过渡,赋予了界面更多的层次感和动感。

然而,直接使用CAGradientLayer图层来实现这些渐变效果,在布局和代码编写上会显得繁琐复杂。这时,创建一个渐变视图组件就显得尤为重要。通过封装CAGradientLayer,我们可以更高效地管理和复用渐变效果,从而提升开发效率。

CAGradientLayer简介

其实在前面的博客中我们已经对CAGradientLayer做了一些介绍,在这里我们再简单的概况一下它的基本属性和使用方法。

CAGradientLayer常用的属性

  • colors:[Ant]?类型,在OC中是id类型的数组,意味着我们可以放任何值,但是事实上它需要的是一个CGColorRef类型的数组,指定了渐变的颜色,默认值nil。
  • locations:[NSNumber]?类型,每个元素的取值范围是0到1,它定义了每个颜色在渐变中的具体位置,通过这些位置,我们可以控制颜色如何在视图中分布和过渡。
  • startPoint:CGPoint类型,渐变开始点需要和endPoint共同作用来定义渐变的方向,比如startPoint是[0.5,0],endPoint是[0.5,1]那么意味着从上往下渐变。
  • endPoint:CGPoint类型,渐变结束的点。
  • type:CAGradientLayerType类型,一共有三个值axial(线性渐变),radial(径向渐变),conic(圆锥渐变)

最常用的就是axial,也是默认值,当我们修改type为其它属性时,记得一定需要设置locations及startPoint和endPoint属性,不然看不见效果奥!

CAGradientLayer基本用法

设置type为.axial:

        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        gradientLayer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
        // 设置渐变颜色的分布位置
        gradientLayer.locations = [0.0, 1.0]
        // 可选:设置渐变的起点和终点
        gradientLayer.startPoint = CGPoint(x: 0.5, y: 0) //顶部中点
        gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)   // 底部中点
        gradientLayer.type = .axial
        self.layer.addSublayer(gradientLayer)

我们设置了颜色为红色和蓝色两种颜色,每个颜色的位置是视图的开始和结束,那么意味着将从中心点开始渐变。

而颜色渐变的方向是从上到下,渐变的方式为线性渐变。

效果如下:

  • 设置type为.radial:

  •         let gradientLayer = CAGradientLayer()
            gradientLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
            gradientLayer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
            // 设置渐变颜色的分布位置
            gradientLayer.locations = [0.0, 1.0]
            // 可选:设置渐变的起点和终点
            gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.5) //中点
            gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)   //右下角
            gradientLayer.type = .radial
            self.layer.addSublayer(gradientLayer)
    

    这次我们修改了type,并且设置开始点为中心点,颜色将呈圆形扩散,扩散的结束点为右下角。

  • 效果如下:

设置type为.conic:

        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        gradientLayer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
        // 设置渐变颜色的分布位置
        gradientLayer.locations = [0.0, 1.0]
        // 可选:设置渐变的起点和终点
        gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.5) //中点
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)   //右下角
        gradientLayer.type = .conic
        self.layer.addSublayer(gradientLayer)

我们设置旋转的中心点为视图的中心点,半径为视图中心点到右下角的距离,而开始位置则是中心点到右下角这一条线,顺时针旋转渐变,效果如下:

创建渐变视图

下面我们就来创建一个通用渐变视图组件,我们可以像其它UIView的视图一样来使用它。

1.创建PHGradientView

首先继承自UIView创建一个名为PHGradientView的视图,并为其添加一个渐变图层。

class PHGradientView: UIView {
    /// 渐变图层
    private let gradientLayer = CAGradientLayer()


    override init(frame: CGRect) {
        super.init(frame: frame)
        self.layer.addSublayer(gradientLayer)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        gradientLayer.frame = self.bounds
    }

}

2.定义常用类型的枚举

在实际开发中常用的渐变都是线性渐变,从左到右或者从上到下,我们将其定义为不同类型的枚举:

enum PHGradientDirection {
    /// 从左到右
    case leftToRight
    /// 从上到下
    case topToBottom
    /// 从左上到右下
    case topLeftToBottomRight
    /// 从右上到左下
    case topRightToBottomLeft
}

3.自定义初始化方法

为视图添加自定义的初始化方法,可以创建最常用的渐变视图,该方法提供了两个必传参数,和两个可选参数。

    /// 自定义初始化方法 默认从左到右
    /// - Parameters:
    /// - startColor: 开始颜色
    /// - endColor: 结束颜色
    /// - direction: 渐变方向
    init(startColor:UIColor, endColor:UIColor,locations:[NSNumber]? = nil,direction:PHGradientDirection = .leftToRight) {
        super.init(frame: .zero)
        self.layer.addSublayer(gradientLayer)
        gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
        gradientLayer.locations = locations
        reloadDirection()
    }

4.设置渐变方向

根据当前的方向枚举值来,通过修改startPoint和endPoint两个值来修改渐变方向:

    private func reloadDirection() {
        switch direction {
        case .leftToRight:
            gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
            gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
        case .topToBottom:
            gradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
            gradientLayer.endPoint = CGPoint(x: 0.5, y: 1)
        case .topLeftToBottomRight:
            gradientLayer.startPoint = CGPoint(x: 0, y: 0)
            gradientLayer.endPoint = CGPoint(x: 1, y: 1)
        case .topRightToBottomLeft:
            gradientLayer.startPoint = CGPoint(x: 1, y: 0)
            gradientLayer.endPoint = CGPoint(x: 0, y: 1)
        }
    }

5.添加一些渐变属性

为视图添加一些属性,可以更灵活的修改渐变图层相对应的属性,比如颜色数组,起始和结束位置等等:

    /// 设置颜色
    var colors:[UIColor]? {
        didSet {
            guard let colors = colors else {
                return
            }
            gradientLayer.colors = colors.map({$0.cgColor})
        }
    }
    
    /// 设置locations
    var locations:[NSNumber]? {
        didSet {
            gradientLayer.locations = locations
        }
    }
    
    /// 设置渐变方向
    var direction:PHGradientDirection = .leftToRight {
        didSet {
            reloadDirection()
        }
    }
    
    /// 修改开始点
    var startPoint:CGPoint = CGPoint(x: 0, y: 0.5) {
        didSet {
            gradientLayer.startPoint = startPoint
        }
    }
    
    /// 修改结束点
    var endPoint:CGPoint = CGPoint(x: 1, y: 0.5) {
        didSet {
            gradientLayer.endPoint = endPoint
        }
    }

使用自定义渐变视图

接下来我们就可以和使用UIView一样来使用渐变视图了,我们可以使用任何布局方式,设置视图的任何属性,比如设置圆角。

        let gradientView1 = PHGradientView(startColor: .yellow, endColor:.cyan)
        gradientView1.layer.masksToBounds = true
        gradientView1.layer.cornerRadius = 10.0
        self.view.addSubview(gradientView1)
        gradientView1.snp.makeConstraints { make in
            make.center.equalToSuperview()
            make.width.height.equalTo(100.0)
        }
        let gradientView2 = PHGradientView(startColor: .red, endColor:.blue)
        gradientView2.direction = .topLeftToBottomRight
        gradientView2.layer.masksToBounds = true
        gradientView2.layer.cornerRadius = 10.0
        self.view.addSubview(gradientView2)
        gradientView2.snp.makeConstraints { make in
            make.centerX.equalToSuperview()
            make.top.equalTo(gradientView1.snp.bottom).offset(20.0)
            make.width.height.equalTo(100.0)
        }
        
        let gradientView3 = PHGradientView(startColor: .green, endColor:.purple)
        gradientView3.direction = .topRightToBottomLeft
        gradientView3.layer.masksToBounds = true
        gradientView3.layer.cornerRadius = 10.0
        self.view.addSubview(gradientView3)
        gradientView3.snp.makeConstraints { make in
            make.centerX.equalToSuperview()
            make.top.equalTo(gradientView2.snp.bottom).offset(20.0)
            make.width.height.equalTo(100.0)
        }

效果如下:

结语

通过本文的介绍,我们了解了如何使用 CAGradientLayer 来创建渐变视图,渐变效果不仅能为应用界面增色不少,还能提升用户的视觉体验。在实际开发中,CAGradientLayer 提供了丰富的功能,通过合理配置,可以实现各种各样的渐变效果。

虽然我们在本文中主要讨论了线性渐变,但 CAGradientLayer 还支持径向渐变和圆锥渐变,开发者可以根据需要进行探索和尝试。创建自定义的渐变视图组件,不仅可以简化代码,还能提高项目的可维护性和扩展性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何利用绩效考核来强化员工对TPM的参与度?

TPM(Total Productive Maintenance, 全面生产维护)作为一种追求生产系统效率最大化的管理模式,其核心在于通过全员参与和持续改进,实现设备综合效率的最大化。然而,要让这一理念深入人心,并转化为员工的日常…

图片转为pdf怎么弄?亲测有效的8个pdf转换方法安利

图片转PDF怎么弄?在日常的办公生活中,我们经常会需要处理一些文档格式转换难题,图片转成PDF格式就是其中一个,图片转换成PDF格式的话,方便我们传输分享,毕竟现在PDF格式凭借着自身的稳定性和可移植性已经成…

李晨晨的嵌入式学习 DAY20

今天主要对zuot学习函数进行了补充 一,文件IO函数 1.fileno函数 类型转换函数 函数原型:int fileno(FILE *stream); 功能:fileno函数用于取得参数stream指定的文件流所使用的文件描述符。文件描述符是一个非负整数,用于在底层…

C/C++开发,opencv光流法跟踪特征点

目录 一、Lucas-Kanade光流法 1.1cv::ORB特征点提取方法 1.2 cv::calcOpticalFlowPyrLK函数 二、完整案例实现 2.1 程序代码 2.2 程序编译及输出 2.3 读取视频文件方式补充 一、Lucas-Kanade光流法 在 OpenCV 中,使用 特征检测器(例如ORB ,Oriented FAST and…

基于深度学习的地磁活动、扰动预测模型

注:包括SYM-H Index和Storm Intensity index A transformer-based framework for predicting geomagnetic indices with uncertainty quantification Journal of Intelligent Information Systems 18 November 2023 A transformer-based framework for predicting…

IP地址怎样实现安全的HTTPS访问?

IP实现HTTPS访问是一个涉及证书申请、服务器配置及网络安全的过程。以下是实现IP实现HTTPS访问的详细步骤: 公网IP地址的重要性:要实现HTTPS访问,必须拥有一个公网IP地址,这是从互联网直接访问网站的基础条件。 管理权限的必要性&…

高效批量提取PPT幻灯片中图片的方法

处理包含大量图片的PPT(PowerPoint)幻灯片已成为许多专业人士的日常任务之一。然而,手动从每张幻灯片中逐一提取图片不仅耗时耗力,还容易出错。为了提升工作效率,减少重复劳动,探索并实现一种高效批量提取P…

“网络信息安全”你真的了解吗?(非常详细)零基础入门到精通,收藏这一篇就够了

全面了解网络信息安全 01 导语: 在数字化浪潮中,我们每个人的生活都越来越依赖于网络。银行账户、个人隐私、企业机密——几乎所有的敏感信息都在网络上流转。随之而来的是不断升级的网络攻击和诈骗手段。本文将深入探讨网络信息安全的意义、挑战、防…

Candance Allegro 入门教程笔记:Cadence Allegro 17.4安装教程

文章目录 一、安装Cadence Allegro 17.4 安装包二、安装Candance Allegro Manager三、安装007号 补丁四、用阿狸狗破戒大师 破戒Candance Allegro 17.4软件 Cadence Allegro QQ交流学习裙:173416628 凡亿教育的Candance Allegro 17.4基础教程 小哥Cadence Allegro …

SSM伊犁旅游攻略网站—计算机毕业设计源码15961

目 录 摘要 1 绪论 1.1 开发背景 1.2开发意义 1.3ssm框架 1.4论文结构与章节安排 2 2 伊犁旅游攻略网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析 2.3.2非功能性分析…

48天笔试训练错题——day43

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 求和 选择题 1. synflood 是 syn 泛洪攻击。有一个恶意主机,伪造大量的 IP 地址,然后给服务器发送 SYN 请求,但是不进行第三次握手的回复,这样就会消耗服务器…

DITA发布MS Word样式定制

- 1 - 概述 上一期我们介绍了摩拿科技针对DITA发布PDF样式定制。 发布PDF通常能够满足大部分手册内容查看的需求,但是有时候公司的销售和服务部门的同事或者客户想要一个能修改的文件,这样可以做二次加工并生成自己想要的输出。这时候MS Word就能胜任…

SpringBoot中使用过滤器filter

过滤器Filter 在 Java 中,Filter(过滤器)是一种用于对请求进行预处理和后处理的机制。 工作原理: 当一个请求到达服务器时,会先经过一系列配置好的过滤器。过滤器可以检查请求的参数、头信息、请求体等内容&#xf…

buuctf CrackRTF (补)

另一种做题方式。 前言:学习笔记。 例题学习,涨大知识。 深入刨析,学习。 常规什么的这次就不写了,这篇wp主要是用于学习,以及分析。 以资料,代码理解,编程思维、编程手法等为主。 重在分析学…

php常见代码执行函数和常见系统命令执行函数。

PHP中常见代码执行函数: array_map() eval() assert() preg_replace() call_user_func() $a($b)动态函数 PHP中常见系统命令执行函数: system() exec() shell_exec() passthru() popen() 反引号"" 命令执行危险函数之assert函数…

成都云飞浩容文化传媒有限公司正规吗怎么样?

在数字经济的浪潮中,电商行业如日中天,成为推动经济增长的重要引擎。在这片蓝海中,如何脱颖而出,实现品牌与销量的双重飞跃?成都云飞浩容文化传媒有限公司,作为电商服务领域的佼佼者,正以专业的…

Echarts图表官网打开太慢怎么办?echarts.apache.org

1.ping官网,获取ip 使用 WIN R 输入cmd 进入命令控制台,ping 官网地址:echarts.apache.org 获取到的IP是 151.101.2.132 2.给hosts文件添加内容 使用文本编辑工具或编译器 打开 C:\Windows\System32\drivers\etc\hosts 文件,在最…

Linux基础知识之管理用户密码

往期系列内容回顾: Linux基础知识之Shell命令行及终端中的快捷键 Linux基础知识之man手册页_man 手册页-CSDN博客 Linux基础知识之Linux文件系统权限-CSDN博客 Linux基础知识之使用 Shell 扩展匹配文件名-CSDN博客 shadow 密码和密码策略 用户密码是Linux用户…

文件目录。

1、转换函数fileno和fdopen 一、文件目录 打开目录:opendir 读取目录:readdir:返回值是info(目录中的一项内容),type表示类型是目录。 关闭目录:closedir 输出的是所有文件,包括隐…

[工具]-gitee+pycharm-配置

安装git ​ 查看git是否安装设置成功: ​ git config user.name ​ git config user.email ​ 码云账号设置邮箱 pycharm设置gitee 打开 PyCharm,在 Settings - Plugins 里面,搜索 Gitee 插件,安装后重启 PyCharm。 pychar…