当前位置: 首页 > news >正文

【iOS】设置背景渐变色

drawRect函数

主要负责iOS的绘图操作,程序会自动调用此方法进行绘图。我在这个函数中绘制渐变背景色。

方法定义:

  • -(void)drawRect:(CGRect)rect;
    重写此方法,执行重绘任务
  • -(void)setNeedsDisplay;
    标记为需要重绘,异步调用drawRect
  • -(void)setNeedsDisplayInRect:(CGRect)rect;
    标记为需要局部重绘

调用机制:

  1. 系统自动调用,在Controller->viewDidLoad之后。但是如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。
  2. 直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0.。

绘制方法

利用CALayer或CGGradientRef绘制。

CALayer

利用CALayer的子类CAGradientLayer绘制渐变背景色。

// 初始化
CAGradientLayer* layer = [[CAGradientLayer alloc] init];
    
// 颜色数组,设置需要过渡的颜色(CGColor对象)。
layer.colors = @[(__bridge id)[UIColor colorWithRed:0.439f green:0.522f blue:0.714f alpha:1].CGColor, (__bridge  id)[UIColor colorWithRed:0.529f green:0.655f blue:0.851f alpha:1].CGColor, (__bridge  id)[UIColor whiteColor].CGColor];
    
// 开始位置与结束位置。(0, 0)左上角,(1, 1)右下角
layer.startPoint = CGPointMake(0.5, 0);
layer.endPoint = CGPointMake(0.5, 1);

// layer大小
layer.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height / 3);
    
[self.layer addSublayer:layer];

展示:
在这里插入图片描述

CGGradientRef

// 图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 颜色空间
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    // 创建颜色数组
    // 由于指定RGB颜色空间,四个数组元素代表一个颜色(r, g, b, alpha)
    CGFloat compoents[12] = {
        0.2, 0.2, 0.2, 1,
        0.4, 0.4, 0.4, 1,
        0.8, 0.8, 0.8, 1
    };
    
    // 渐变位置(0~1),数组元素个数不小于颜色数
    CGFloat locations[3] = {0, 0.4, 0.8};
    
    // 创建梯度上下文
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, compoents, locations, 3);
    
    // 绘制线性渐变
    /*
     startPoint与endPoint:起始于结束位置,需要位置坐标
     options:绘制方式
     kCGGradientDrawsBeforeStartLocation 开始位置之前就进行绘制,到结束位置之后不再绘制,
     kCGGradientDrawsAfterEndLocation 开始位置之前不进行绘制,到结束点之后继续填充
     */
    CGContextDrawLinearGradient(ctx, gradient, CGPointMake(self.frame.size.width/2, 0), CGPointMake(self.frame.size.width/2, self.frame.size.height/3), kCGGradientDrawsAfterEndLocation);
    
    // 释放颜色空间
    CGColorSpaceRelease(colorSpace);

展示:
在这里插入图片描述

相关文章:

  • JUC并发编程——wait-notify
  • PPQ库中KLD算法实现代码解析
  • 我就不信你还不懂HashSet/HashMap的底层原理
  • pytorch学习之pytorch构建模型的流程
  • react-swipeable-views轮播图实现下方的切换点控制组件
  • Java线程知识点总结
  • Android Compose——一个简单的Bilibili APP
  • 世界顶级五大女程序媛,不仅技术强还都是美女
  • 2023年再不会Redis,就要被淘汰了
  • 【学习笔记】深入理解JVM之垃圾回收机制
  • 【数据结构】链式二叉树
  • 自学大数据第三天~终于轮到hadoop了
  • 应用层协议 HTTP HTTPS
  • Linux内核学习笔记——页表的那些事。
  • 一文带你入门,领略angular风采(上)!!!
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS3 变换
  • JAVA SE 6 GC调优笔记
  • Kibana配置logstash,报表一体化
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 电商搜索引擎的架构设计和性能优化
  • 理解在java “”i=i++;”所发生的事情
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 一个项目push到多个远程Git仓库
  • 一起参Ember.js讨论、问答社区。
  • 运行时添加log4j2的appender
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (3)选择元素——(17)练习(Exercises)
  • (篇九)MySQL常用内置函数
  • (转)VC++中ondraw在什么时候调用的
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .axf 转化 .bin文件 的方法
  • .Net Core 中间件验签
  • .NET 发展历程
  • .net 提取注释生成API文档 帮助文档
  • .NET和.COM和.CN域名区别
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @EnableConfigurationProperties注解使用
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [04]Web前端进阶—JS伪数组
  • [2016.7 day.5] T2
  • [20180224]expdp query 写法问题.txt
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [C++]模板与STL简介
  • [CentOs7]iptables防火墙安装与设置
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [Geek Challenge 2023] web题解
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明