ios创建两色线性径向渐变扇形

2023-05-16

设计:创建一个扇形遮罩,再创建一个两色径向渐变圆,用扇形遮罩去剪切径向渐变圆,就得到一个两色线性径向渐变扇形.

一.先创建一个扇形遮罩.(里面的函数代码什么意义,按住command,点函数名就可进去看了)

1.创建一个四分之七(这个数随便定)的扇形.下面代码放入- (void)drawRect:(CGRect)rect方法,如果在init赋初值(_c为中心点,_radius为半径),运行就可看到一个红色的四分七扇形了.这里的color不要用black和white哦

    CGContextRef imgCtx = UIGraphicsGetCurrentContext();
    CGContextMoveToPoint(imgCtx, _c.x,_c.y);
    CGContextSetFillColor(imgCtx, CGColorGetComponents([UIColor redColor].CGColor));
    CGContextAddArc(imgCtx, _c.x, _c.y, _r,  -M_PI/2, 5*M_PI/4, 0);
    CGContextFillPath(imgCtx);
2.把它放入到一个ImageContext,并保留下来,就算一个遮罩mask了.不用去运行,运行什么也看不到.

    UIGraphicsBeginImageContext(rect.size);
    CGContextRef imgCtx = UIGraphicsGetCurrentContext();
    CGContextMoveToPoint(imgCtx, _c.x,_c.y);
    CGContextSetFillColor(imgCtx, CGColorGetComponents([UIColor redColor].CGColor));
    CGContextAddArc(imgCtx, _c.x, _c.y, _r,  -M_PI/2, 5*M_PI/4, 0);
    CGContextFillPath(imgCtx);
    //save the context content into the image mask
    CGImageRef mask = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext());
    UIGraphicsEndImageContext();
3.顺便也把剪切写好吧.运行一样,什么也看不了.注意ctx和上面的imgCtx是两个context

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef imgCtx = UIGraphicsGetCurrentContext();
    CGContextMoveToPoint(imgCtx, _c.x,_c.y);
    CGContextSetFillColor(imgCtx, CGColorGetComponents([UIColor redColor].CGColor));
    CGContextAddArc(imgCtx, _c.x, _c.y, _r,  -M_PI/2, 5*M_PI/4, 0);
    CGContextFillPath(imgCtx);
    //save the context content into the image mask
    CGImageRef mask = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext());
    UIGraphicsEndImageContext();
    CGContextClipToMask(ctx, self.bounds, mask);
    CGImageRelease(mask);

二.创建一个两色径向渐变圆,(把上面的代码注释,专心画渐变圆吧).主要使用CGContextDrawRadialGradient,它需要一个gradient,所以先创建吧.

1.使用CGGradientCreateWithColorComponents创建渐变需要四参数.space,components[], locations[],count.使用CGColorSpaceCreateDeviceRGB()就可得到一个space;创建的是线性(均匀)的,将locations[]设为NULL;count是两色,设为2;components[]就看下面代码,两种方法创建:

方法A:

    UIColor *startColor=[UIColor yellowColor];
    UIColor *endColor= [UIColor blueColor];
    UIColor *colors[2] = {startColor,endColor};
    CGFloat components[2*4];
    for (int i = 0; i < 2; i++) {
        CGColorRef tmpcolorRef = colors[i].CGColor;
        const CGFloat *tmpcomponents = CGColorGetComponents(tmpcolorRef);
        for (int j = 0; j < 4; j++) {
            components[i * 4 + j] = tmpcomponents[j];
        }
    }

方法B:

    CGFloat components[8]={
        1.0, 1.0, 0.0, 1.0,     //start color(r,g,b,alpha)
        0.0, 0.0, 1.0, 1.0      //end color
    };
这两种方法的颜色rgb和alpha都好控制.那我就用B方法创建渐变吧,不要忘了release.终于创建了gradient.这段时间运行看不到效果,不必去运行了.

    CGFloat components[8]={
        1.0, 1.0, 0.0, 1.0,     //start color(r,g,b,alpha)
        0.0, 0.0, 1.0, 1.0      //end color
    };
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(space, components, NULL,2);
    CGColorSpaceRelease(space),space=NULL;//release

2.CGContextDrawRadialGradient方法需要7参数,上面只搞定了gradient,剩下一个一个给吧.

    CGPoint start = _c;
    CGPoint end = _c;
    CGFloat startRadius = 0.0f;
    CGFloat endRadius = _r;
    CGContextRef graCtx = UIGraphicsGetCurrentContext();
    CGContextDrawRadialGradient(graCtx, gradient, start, startRadius, end, endRadius, 0);
    CGGradientRelease(gradient),gradient=NULL;//release

将上面两小段代码拼在一起,运行就可以看到一个两色径向渐变圆了.也不要忘了release gradient.


三.最后调整,拼接.画扇形的color改为black,起始弧度,结束弧度,画弧方向都调整下.

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef imgCtx = UIGraphicsGetCurrentContext();
    CGContextMoveToPoint(imgCtx, _c.x,_c.y);
    CGContextSetFillColor(imgCtx, CGColorGetComponents([UIColor blackColor].CGColor));
    CGContextAddArc(imgCtx, _c.x, _c.y, _r,  M_PI/2, -5*M_PI/4, 1);
    CGContextFillPath(imgCtx);
    //save the context content into the image mask
    CGImageRef mask = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext());
    UIGraphicsEndImageContext();
    CGContextClipToMask(ctx, self.bounds, mask);

    CGFloat components[8]={
        1.0, 1.0, 0.0, 1.0,     //start color(r,g,b,alpha)
        0.0, 0.0, 1.0, 1.0      //end color
    };
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(space, components, NULL,2);
    CGColorSpaceRelease(space),space=NULL;//release
    
    CGPoint start = _c;
    CGPoint end = _c;
    CGFloat startRadius = 0.0f;
    CGFloat endRadius = _r;
    CGContextRef graCtx = UIGraphicsGetCurrentContext();
    CGContextDrawRadialGradient(graCtx, gradient, start, startRadius, end, endRadius, 0);
    CGGradientRelease(gradient),gradient=NULL;//release

再运吧.


完整代码下载:

http://download.csdn.net/detail/xiejx618/6018683


参考的文章有:

http://www.thinkandbuild.it/how-to-build-a-custom-control-in-ios/

http://kongkongbrain.blog.163.com/blog/static/178199013201110233366847/



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios创建两色线性径向渐变扇形 的相关文章

  • 编译protobuf v3.20.0

    https github com protocolbuffers protobuf git clone git 64 github com protocolbuffers protobuf git cd protobuf git check
  • Ubuntu18.04安装配置Samba

    1 安装samba sudo apt install samba 2 添加用户 xiaxinkai 64 aliyun etc samba sudo smbpasswd a xiaxinkai New SMB password Retype
  • 【开发工具】适用于Windows的Linux子系统一一WSL安装使用教程

    文章目录 一 简介二 准备工作二 安装WSL2 1 启用适用于 Linux 的 Windows 子系统2 2 启用虚拟机功能2 3 安装所选的 Linux 分发 一 简介 Windows Subsystem for Linux xff08
  • github如何删除commit记录

    git reset hard acb28f2114413378d48ae3b257dca62a1cd29d0f 想要恢复到的版本commit id git push origin HEAD force
  • Windows7 PowerShell 2.0升级到 PowerShell 5.1

    Windows7 sp1内置的PowerShell的版本是v2 0 xff0c 现需要将其升级到v5 1 xff0c 过程中有一个环节需要引起注意 xff0c 为了以后查阅的方便 xff0c 现将其记录下来 1 查看PowerShell版本
  • 解决:硬盘安装Ubuntu16.04引导后加载失败

    按照网上硬盘安装Ubuntu的方法 xff0c 配置完毕后每次都在这个画面之后黑屏 xff0c 卡住不动 xff0c 加载失败 网上找了很多办法 xff0c 有的说是UEFI的问题 xff0c 有的说是N卡不兼容 xff0c 尝试了很多都没
  • Appuim+Pycharm+Pytest 自动化测试环境搭建 Mac版

    这一套流程有很多坑 xff0c 因为最近换主机原因被迫搭了2 xff0c 3次 xff0c 忍无可忍打算记录一下超详细的搭建过程 注意 xff1a 下载环境过程中 xff0c 下文有很多链接地址需要访问GitHub外网 xff0c 访问不了
  • [Mac 基础知识]:用Time Machine 恢复mac系统

    如果您使用 Time Machine 来备份 Mac xff0c 则在系统或启动磁盘损坏时可以恢复系统 Important 使用 Time Machine 备份将您的系统恢复到该备份的源 Mac 若 要将信息传输到新 Mac xff0c 请
  • jetson-tx2-4g ubuntu18系统设置中desktop sharing 无法打开的问题

    1 系统设置中desktop sharing无法打开需要进行以下几步 xff1a sudo apt get install vino dconf editor dconf write org gnome desktop remote acc
  • ubuntu18.04安装xrdp过程

    一 安装桌面环境 以具有 sudo 权限的用户身份键入以下命令 xff0c 以在服务器上安装 Xfce xff1a sudo apt update sudo apt install xfce4 xfce4 goodies xorg dbus
  • 瑞芯微RV1126/1109开发流程之模型转换

    1 环境搭建 xff08 PC端ubuntu16 04搭建rknn环境 xff09 xff08 1 xff09 安装anaconda环境 xff08 为了便于管理自己的环境建议安装 xff0c 安装步骤请自行搜索 xff0c 本人安装ana
  • 瑞芯微RV1126/1109开发流程之驱动升级

    1 1126硬件参数读取 xff08 1 xff09 CPU温度读取 46300和47100分别代表46 3 47 1 xff08 2 xff09 查看1126的NPU xff08 3 xff09 查询NPU驱动版本 dmesg grep
  • 如何在 ubuntu 安装并配置Go?

    如何在 ubuntu 安装并配置Go xff1f 虽然安装和配置go很简单 xff0c 但是很多初学者在第一次安装go环境时会遇到各种坑 这篇博客完整演示一次如何在ubuntu上安装和配置golang 第一步 xff0c 查看系统版本 xf
  • 瑞芯微RV1126/1109开发流程之yolov5部署(c++版本)

    1 ubuntu上安装rv1126交叉编译工具链 方式一 xff1a xff08 1 xff09 下载交叉编译工具 交叉编译器概念 xff1a 交叉编译器可以使我们在主机上编译出可以在嵌入式设备上运行的程序 下载地址 xff1a Downl
  • 瑞芯微RV1126/1109开发流程之资料收藏

    RKMedia Firefly Wiki https blog csdn net u013171226 category 11410227 html目前该博主已经建立专栏 RV1109 RV1126系列 3 RV1109 1126 RKNN
  • 瑞芯微RV1126/1109开发流程之opencv交叉编译

    1 下载opencv并解压 这里的opencv版本是我一直用者的opencv3 4 0 没有opencv的可以到这里 xff08 https opencv org releases page 5 xff09 下载 2 创建build和ins
  • yolov5目标检测算法研究之参考资料

    CSP网络架构 深度学习之CSPNet分析 tt丫的博客 CSDN博客 cspnet结构 深度学习入门小菜鸟 xff0c 希望像做笔记记录自己学的东西 xff0c 也希望能帮助到同样入门的人 xff0c 更希望大佬们帮忙纠错啦 侵权立删 目
  • pytorch统计模型参数量并输出

    有时候需要统计我们自己构建的模型参数 与baseline的网络比较 统计神经网络模型参数 方式一 def get parameter number net total num 61 sum p numel for p in net para
  • TCP传输过程中,客户端异常退出导致服务端send函数崩溃

    在linux下编写TCP socket程序时 xff0c 如果客户端突然退出 xff0c 导致连接中断 xff0c 这个时候服务端如果继续调用send函数发送数据的话 xff0c 会导致整个进程退出 xff0c 这是我们不愿看到的 xff0
  • linux socket编程 close函数详解

    int close int fd close 函数存在于函数库unistd h函数库中 xff1b close 函数用于释放系统分配给套接字的资源 xff0c 该函数即文件操作中常用的close函数 参数fd为需要关闭的套接字文件描述符 x

随机推荐