Swift - Core Graphics绘图框架详解3(绘制渐变、填充渐变色)

Swift学习之:设置渐变色 在开发中,常常有这样的需求:给button添加渐变色、给label添加渐变色等等,因此只需要写一个UIView的类扩展,这些继承自UIView的类需要用的时候就能直接调用了。 代码如下: extension UIView { @discardableResult func setGradient(colors: [UIColor], startPoint: CGPoint ... 阅读详情
Quartz 2D 的渐变方式分为如下两种:
  • 线性渐变:渐变色以直线方式从开始位置逐渐向结束位置渐变
  • 放射性渐变:以中心点为圆心从起始渐变色向四周辐射,直到终止渐变色
使用中我们可以直接绘制一个渐变,也可以将渐变填充到现有的图形路径上。下面通过样例分别进行演示。

一、渐变的绘制 

1,绘制线性渐变

原文:Swift - Core Graphics绘图框架详解3(绘制渐变、填充渐变色)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import  UIKit
 
class  ViewController :  UIViewController  {
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
         
         let  frame =  CGRect (x: 30, y: 30, width: 250, height: 100)
         let  cgView =  CGView (frame: frame)
         self .view.addSubview(cgView)
     }
     
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}
 
class  CGView : UIView  {
     
     override  init (frame:  CGRect ) {
         super . init (frame: frame)
         //设置背景色为透明,否则是黑色背景
         self .backgroundColor =  UIColor .clear
     }
     
     required  init ?(coder aDecoder:  NSCoder ) {
         fatalError( "init(coder:) has not been implemented" )
     }
 
     override  func  draw(_ rect:  CGRect ) {
         super .draw(rect)
         
         //获取绘图上下文
         guard  let  context =  UIGraphicsGetCurrentContext ()  else  {
             return
         }
         
         //使用rgb颜色空间
         let  colorSpace =  CGColorSpaceCreateDeviceRGB ()
         //颜色数组(这里使用三组颜色作为渐变)fc6820
         let  compoents:[ CGFloat ] = [0xfc/255, 0x68/255, 0x20/255, 1,
                                    0xfe/255, 0xd3/255, 0x2f/255, 1,
                                    0xb1/255, 0xfc/255, 0x33/255, 1]
         //没组颜色所在位置(范围0~1)
         let  locations:[ CGFloat ] = [0,0.5,1]
         //生成渐变色(count参数表示渐变个数)
         let  gradient =  CGGradient (colorSpace: colorSpace, colorComponents: compoents,
                                   locations: locations, count: locations.count)!
         
         //渐变开始位置
         let  start =  CGPoint (x:  self .bounds.minX, y:  self .bounds.minY)
         //渐变结束位置
         let  end =  CGPoint (x:  self .bounds.maxX, y:  self .bounds.minY)
         //绘制渐变
         context.drawLinearGradient(gradient, start: start, end: end,
                                    options: .drawsBeforeStartLocation)
     }
}

2,绘制放射性渐变

原文:Swift - Core Graphics绘图框架详解3(绘制渐变、填充渐变色)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class  CGView : UIView  {
     
     override  init (frame:  CGRect ) {
         super . init (frame: frame)
         //设置背景色为透明,否则是黑色背景
         self .backgroundColor =  UIColor .clear
     }
     
     required  init ?(coder aDecoder:  NSCoder ) {
         fatalError( "init(coder:) has not been implemented" )
     }
 
     override  func  draw(_ rect:  CGRect ) {
         super .draw(rect)
         
         //获取绘图上下文
         guard  let  context =  UIGraphicsGetCurrentContext ()  else  {
             return
         }
         
         //使用rgb颜色空间
         let  colorSpace =  CGColorSpaceCreateDeviceRGB ()
         //颜色数组(这里使用三组颜色作为渐变)fc6820
         let  compoents:[ CGFloat ] = [0xfc/255, 0x68/255, 0x20/255, 1,
                                    0xfe/255, 0xd3/255, 0x2f/255, 1,
                                    0xb1/255, 0xfc/255, 0x33/255, 1]
         //没组颜色所在位置(范围0~1)
         let  locations:[ CGFloat ] = [0,0.5,1]
         //生成渐变色(count参数表示渐变个数)
         let  gradient =  CGGradient (colorSpace: colorSpace, colorComponents: compoents,
                                   locations: locations, count: locations.count)!
         
         //渐变圆心位置(这里外圆内圆都用同一个圆心)
         let  center =  CGPoint (x:  self .bounds.midX, y:  self .bounds.midY)
         //外圆半径
         let  endRadius =  min ( self .bounds.width,  self .bounds.height) / 2
         //内圆半径
         let  startRadius = endRadius / 3
         //绘制渐变
         context.drawRadialGradient(gradient,
                                    startCenter: center, startRadius: startRadius,
                                    endCenter: center, endRadius: endRadius,
                                    options: .drawsBeforeStartLocation)
     }
}

二、渐变的填充

不管是线性渐变、还是放射性渐变,除了像上面那样直接绘制到背景上外,还可以填充绘制成任何的形状。
首先我们自定义一个要填充的  path,无论是什么形状都可以。接着将其加入到  Context 中,用来做  Clip。最后在绘制渐变即可。

1,填充矩形

通过  context.clip(to: CGRect) 和  context.clip(to: [CGRect]),我们可以很方便的设置矩形的  Clip。下面样例使用后一个方法,在视图上同时添加多个矩形  Clip。
原文:Swift - Core Graphics绘图框架详解3(绘制渐变、填充渐变色)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class  CGView : UIView  {
     
     override  init (frame:  CGRect ) {
         super . init (frame: frame)
         //设置背景色为透明,否则是黑色背景
         self .backgroundColor =  UIColor .clear
     }
     
     required  init ?(coder aDecoder:  NSCoder ) {
         fatalError( "init(coder:) has not been implemented" )
     }
     
     override  func  draw(_ rect:  CGRect ) {
         super .draw(rect)
         
         //获取绘图上下文
         guard  let  context =  UIGraphicsGetCurrentContext ()  else  {
             return
         }
         
         //创建clip矩形
         let  rect1 =  CGRect (x: 0, y: 0,
                            width:  self .bounds.width/4, height:  self .bounds.height/2)
         let  rect2 =  CGRect (x:  self .bounds.maxX/4, y:  self .bounds.maxY/2,
                            width:  self .bounds.width/4, height:  self .bounds.height/2)
         let  rect3 =  CGRect (x:  self .bounds.maxX/2, y: 0,
                            width:  self .bounds.width/4, height:  self .bounds.height/2)
         let  rect4 =  CGRect (x:  self .bounds.maxX/4*3, y:  self .bounds.maxY/2,
                            width:  self .bounds.width/4, height:  self .bounds.height/2)
         context.clip(to: [rect1, rect2, rect3, rect4])
         
         //使用rgb颜色空间
         let  colorSpace =  CGColorSpaceCreateDeviceRGB ()
         //颜色数组(这里使用三组颜色作为渐变)fc6820
         let  compoents:[ CGFloat ] = [0xfc/255, 0x68/255, 0x20/255, 1,
                                    0xfe/255, 0xd3/255, 0x2f/255, 1,
                                    0xb1/255, 0xfc/255, 0x33/255, 1]
         //没组颜色所在位置(范围0~1)
         let  locations:[ CGFloat ] = [0,0.5,1]
         //生成渐变色(count参数表示渐变个数)
         let  gradient =  CGGradient (colorSpace: colorSpace, colorComponents: compoents,
                                   locations: locations, count: locations.count)!
         
         //渐变开始位置
         let  start =  CGPoint (x:  self .bounds.minX, y:  self .bounds.minY)
         //渐变结束位置
         let  end =  CGPoint (x:  self .bounds.maxX, y:  self .bounds.minY)
         //绘制渐变
         context.drawLinearGradient(gradient, start: start, end: end,
                                    options: .drawsBeforeStartLocation)
     }
}

2,填充不规则的图形

要实现不规则形状的填充,可以先创建对应的  path 并添加到上下文中,再通过  context.clip() 方法设置  Clip 即可。下面以实现一个菱形渐变为例。 
原文:Swift - Core Graphics绘图框架详解3(绘制渐变、填充渐变色)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class  CGView : UIView  {
     
     override  init (frame:  CGRect ) {
         super . init (frame: frame)
         //设置背景色为透明,否则是黑色背景
         self .backgroundColor =  UIColor .clear
     }
     
     required  init ?(coder aDecoder:  NSCoder ) {
         fatalError( "init(coder:) has not been implemented" )
     }
     
     override  func  draw(_ rect:  CGRect ) {
         super .draw(rect)
         
         //获取绘图上下文
         guard  let  context =  UIGraphicsGetCurrentContext ()  else  {
             return
         }
         
         //创建并设置路径
         let  path =  CGMutablePath ()
         path.move(to:  CGPoint (x:  self .bounds.midX, y:  self .bounds.minY))
         path.addLine(to:  CGPoint (x:  self .bounds.maxX, y:  self .bounds.midY))
         path.addLine(to:  CGPoint (x:  self .bounds.midX, y:  self .bounds.maxY))
         path.addLine(to:  CGPoint (x:  self .bounds.minX, y:  self .bounds.midY))
         path.closeSubpath()
         //添加路径到图形上下文
         context.addPath(path)
         context.clip()
         
         //使用rgb颜色空间
         let  colorSpace =  CGColorSpaceCreateDeviceRGB ()
         //颜色数组(这里使用三组颜色作为渐变)fc6820
         let  compoents:[ CGFloat ] = [0xfc/255, 0x68/255, 0x20/255, 1,
                                    0xfe/255, 0xd3/255, 0x2f/255, 1,
                                    0xb1/255, 0xfc/255, 0x33/255, 1]
         //没组颜色所在位置(范围0~1)
         let  locations:[ CGFloat ] = [0,0.5,1]
         //生成渐变色(count参数表示渐变个数)
         let  gradient =  CGGradient (colorSpace: colorSpace, colorComponents: compoents,
                                   locations: locations, count: locations.count)!
         
         //渐变开始位置
         let  start =  CGPoint (x:  self .bounds.minX, y:  self .bounds.minY)
         //渐变结束位置
         let  end =  CGPoint (x:  self .bounds.maxX, y:  self .bounds.minY)
         //绘制渐变
         context.drawLinearGradient(gradient, start: start, end: end,
                                    options: .drawsBeforeStartLocation)
     }
}

Swift 动态导航栏:颜色渐变与头部图片动画效果实现 当我们的动画实现变得越来越复杂时,代码的重用性和可维护性会成为关注的焦点。在这一章中,我们将深入探讨如何将复杂的动画逻辑封装进自定义控件和扩展中,使其更加模块化并易于在整个项目中复用。此外,我们还将学习如何扩展TableView的使用范围,以便轻松实现具有丰富动画效果的滑动交互。封装动画逻辑为自定义控件的首要步骤是设计控件的接口。这涉及到确定控件需要哪些属性和方法来满足其功能。例如,如果我们的动画涉及到颜色的渐变,我们可能需要设置起始色和结束色的属性,以及一个开始动画的方法。// 接口属性定义。 阅读详情

相关推荐

swift-一个半圆形进度的圆盘可控制进度渐变色以及旋转的弧度

一个半圆形进度的圆盘,可控制进度,渐变色以及旋转的弧度

Swift渐变色

1 view 颜色渐变 1.1 效果如下: 1.2 代码: let thisView = UIView(frame: CGRect(x: 100, y: 100, width: 300, height: 10)) view.addSubview(thisView) let gradientLayer = CAGradientLayer() gradientLayer.frame = thisView.bounds this

iOS攻城狮 3515

swift-GradientColor一些好看的渐变色

GradientColor 一些好看的渐变色

SwiftUI中三大渐变色的介绍

在SwiftUI中,渐变色是一种常用的视觉效果,用于创建平滑过渡的颜色变化。通过使用渐变色,我们可以实现丰富多彩的界面设计,增强用户体验。

郭永明的技术专栏 1921

Gradient-View:一个带有渐变的Swift 4 UIView类,可以在故事板上进行自定义(颜色,方向,阴影,cornerRadius ...)

渐变视图 一个在故事板上可自定义渐变的Swift 4 UIView类(颜色,方向,阴影,cornerRadius ...) GradientView:UIView是一个@IBDesignable类,以便在您的情节提要中呈现,并且其所有属性都是@IBInspectable,以便您可以在“属性”检查器中的情节提要中自定义渐变视图。 快速安装: 只需将此类拖到您的项目中 在情节提要中,选择一个UIView 转到身份检查器,然后在“类”字段中键入GradientView而不是UIView 与属性检查器一起实时查看结果! 您可以为渐变选择两种颜色 阴影的一种颜色 您可以选择阴影位置(x / y)及其模糊 从起点到终点的渐变方向(左上为0,0,右下为1,1) 视图的角半径 您可以通过调用animate(duration: TimeInterval, newTopColor: UIColor

swift-过渡色背景渐变View

过渡色背景渐变 View

swift 设置渐变背景颜色

let layer = CAGradientLayer()layer.frame = view.bounds///设置颜色layer.colors = [color("61ccc8").cgColor,color("61ccc8").cgColor,kRGBColorAlpha(r: 97, g: 204, b: 200, alpha: 0.1).cgColor]///设置颜色渐变的位置 (我这里...

aasdsjk的博客 4867

swift 实现导航栏随tableView滑动颜色渐变、头部图片往上移动效果和往下放大效果

实现导航栏随tableView滑动颜色渐变、头部图片往上移动效果和往下放大效果的demo

swift - layer - 渐变色 - CAGradientLayer

1。创建 渐变色 /// 渐变色:默认从上到下 private var gradientLayer: CAGradientLayer = { let g = CAGradientLayer() g.colors = [UIColor.init(hexColor: "DBB479").cgColor, ...

weixin_34101229的博客 576

基于STM32的多路火灾报警系统设计

本文设计了一款基于STM32的多路火灾报警系统,利用多个传感器组合(如烟雾传感器、温度传感器等)进行数据采集与处理,精确判断火灾情况,并及时发出报警信号,保障生命与财产安全。本系统设计了一款基于STM32的多路火灾报警系统,通过结合烟雾传感器和温度传感器,提升了火灾检测的准确性和可靠性。未来,系统可以进一步集成更多传感器,如气体传感器、湿度传感器等,进一步提升火灾报警系统的智能化水平。本系统采用STM32F103单片机作为核心处理单元,结合烟雾传感器、温度传感器和报警模块,实现多通道火灾报警功能。

stm32d1219的博客 2028

【MDC开发者课程】MDC功能软件-归控算法介绍

规控算法

博客标题不能为空我也没办法 1844

Swift-Core Graphics绘图框架详解3(绘制渐变、填充渐变色)

Quartz 2D 的渐变方式分为如下两种: 线性渐变:渐变色以直线方式从开始位置逐渐向结束位置渐变放射性渐变:以中心点为圆心从起始渐变色向四周辐射,直到终止渐变色 使用中我们可以直接绘制一个渐变,也可以将渐变填充到现有的图形路径上。下面通过样例分别进行演示。 一、渐变的绘制  1,绘制线性渐变 import UIKit  

雨夜枫起的博客 2842

整车CAN网络错误帧排查方法

本文围绕 CAN 总线错误帧展开,先剖析其产生原因,涵盖物理连接与硬件问题、电磁兼容性问题、总线负载与设计问题及配置问题;再阐述位错误、填充错误等 5 类错误帧类型;接着说明错误帧与总线 BUSOFF 的关系,解析主动 / 被动错误状态及 BUSOFF 的触发与恢复;还结合整车故障案例做实际分析,指出错误帧根源多为线束或控制器问题。最后总结,强调错误帧是 CAN 协议保障高鲁棒性的机制,掌握相关知识助工程师提升 CAN 网络处理能力。

车载网络小D的博客 1246

ios绘图系列五:绘制渐变CGContextDrawLinearGradient, CGContextDrawRadialGradient, CAGradientLayer

iOS Core Graphics 的渐变可以分成径向渐变和辐射渐变.可以实现如下的图形: 可以在view 的 - (void)drawRect:(CGRect)rect实现 CGContextRef ctx = UIGraphicsGetCurrentContext(); //创建一个RGB的颜色空间 CGColorSpaceRef rgb = CG

lcl130的专栏 8608

【PowerBI专栏】PowerBI导入MYSQL数据库

本文介绍了在PowerBI中连接MySQL数据库的方法。首先需要下载并安装MySQL官方.NET连接驱动(推荐8.4.0版本),安装完成后重启PowerBI。连接时需填写服务器IP和数据库名称等必填参数。文章详细说明了连接配置步骤,包括账户设置、数据表选择以及可能遇到的数据格式转换问题处理。最后指导用户完成数据清洗后进入PowerPivot进行后续计算。特别提醒最新9.4版本可能存在兼容性问题,建议使用稳定的8.4版本连接器。

技术与管理的平衡木- 689

Microsemi Libero系列教程(六)——Identify片上逻辑分析仪的使用

文章目录FPGA如何进行在线调试关于Microsemi片上逻辑分析仪FPGA片上逻辑分析仪原理预期效果0.准备一个创建好的Libero工程1.新建identify工程,并添加想要监测的信号2.管脚分配,编译下载3.设置触发类型4.IICE逻辑分析仪核资源占用 系列教程:Microsemi Libero系列教程 FPGA如何进行在线调试 对于嵌入式系统来说,如单片机,进行硬件级程序调试时,通常采用的是JLink/ST-Link调试器,在线调试的方式来获取程序实时运行的状态,可以观察程序运行流程、各种变量的值

whik1194的博客 1万+

drawRect

// Only override drawRect: if you perform custom drawing.   // An empty implementation adversely affects performance during animation.   - (void)drawRect:(CGRect)rect   {       CGContextRe

The Life with iOS 957

四足狗机器人硬件开发技术栈详解

本文系统介绍了四足狗机器人的硬件开发技术,重点分析了五大核心模块:机械结构(骨架设计)、动力系统(关节驱动)、感知系统(环境监测)、控制系统(决策中枢)和电源系统(能源管理)。文章详细阐述了各模块的选型标准、技术要点和协同设计原则,提供了从需求定位到组装调试的完整开发流程,并针对常见问题给出解决方案。随着材料轻量化、模块标准化和AI集成化的发展趋势,四足机器人硬件将向更灵活、更智能的方向演进,为工业巡检、应急救援等场景提供更强大的移动平台支持。

start_up_go的博客 284

swift 两种渐变色背景写法

func setGradualChangColor(frame: CGRect, startColorString: String, endColorString: String) -> CAGradientLayer { let gradientLayer = CAGradientLayer() gradientLayer.frame = frame...

高级软件开发工程师--周玉的博客 3852

github创建账号第一步始终出错

github创建账号总结:第一次注册GitHub,填好用户名邮箱密码后进入下一步就卡在哪里,上面还提示Unable to verify your captcha response等,进入网址的解决办法以及下载其他的浏览器也无法解决,用手机浏览器抱着试一试的心态竟然成功了,分享给大家。手机下载谷歌浏览器,进入GitHub正常注册,能向下继续,邮箱验证完以后再用电脑登陆就ok啦

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4373

fanuc机器人KAREL中 函数的应用

本次课程讲解编程的思路。很多的同学都玩过积木,一个一个的模块逐渐累积起来,通过彼此之间的相互联系,最终形成一个完整的整体。其实编程也是这样。 将一个对象根据其特点进行模块化拆分,尤其是一些特点非常相似的内容,将其变成一个模块。然后通过传递参数,实现不同的功能,这就是模块化编程。

haier123888的博客 2744

【Swift】iOS 渐变色的圆绘制

性能监测工具

Hanrovey Blog 1386

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Swift 渐变 image

// 扩展 UIImage 的 init 方法,获得渐变效果 public extension UIImage { convenience init?(gradientColors:[UIColor], size:CGSize = CGSizeMake(10, 10) ) { UIGraphicsBeginImageContextWithOptions(size, t

Shinkai_的博客 2713

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

swift 给UIbutton添加渐变

font = UIFont(name: "苹方-简 中黑体", size: kUIFitSize(size: 16))btnt.setTitle("显示已结束的计划", for: .normal)btnt.setTitle("显示已结束的课程", for: .normal)首先要给UIbutton 一个UIView做background图片,然后给这个图片的layer设置。

cola_wh的博客 1689

Swift Core Graphics教程之Gradients 与 Context

为Xcode 6.3 和 Swift1.2更新欢迎回到我们的Swift核心绘图教程系列!

Mr.Simple的专栏 4280
上一篇: Swift - Core Graphics绘图框架详解2(绘制图形)
下一篇: 添加虚线 (Swift4)
FlyingFireFish
博客等级 码龄9年 23粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值