主要思路是:
1.使用UIBezierPath绘制一个六边形路径
2.创建一个CAShapeLayer图层,将这个六边形path设置到CAShapeLayer属性上。然后设置fillColor为透明,strokeColor为黑色,lineWidth为5.0
3.创建一个CAGradientLayer渐变色图层,并将它的渐变类型设置成kCAGradientLayerConic以圆心为起点,以圆边为中点,并沿着圆旋转一周
4.设置CAGradientLayer.mask = CAShapeLayer, 得出一个被CAShapeLayer切割后的六边形
5.给CAGradientLayer的colors内容添加动态,让渐变图层的内容旋转,从而得到六边形渐变色旋转的结果
创建一个路径,也可以根据自己的需要进行创建,这里创建的是一个六边形
CGFloat squareSize = MIN(imageSize.width, imageSize.height);
UIBezierPath * path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake((sin(M_1_PI / 180 * 60)) * (squareSize / 2), (squareSize / 4))];
[path addLineToPoint:CGPointMake((squareSize / 2), 0)];
[path addLineToPoint:CGPointMake(squareSize - ((sin(M_1_PI / 180 * 60)) * (squareSize / 2)), (squareSize / 4))];
[path addLineToPoint:CGPointMake(squareSize - ((sin(M_1_PI / 180 * 60)) * (squareSize / 2)), (squareSize / 2) + (squareSize / 4))];
[path addLineToPoint:CGPointMake((squareSize / 2), squareSize)];
[path addLineToPoint:CGPointMake((sin(M_1_PI / 180 * 60)) * (squareSize / 2), (squareSize / 2) + (squareSize / 4))];
[path closePath];
将创建好的UIBezierPath传递给CAShapeLayer图层中,让图层拥有path的图案
CAShapeLayer *pathLayer = [CAShapeLayer layer];
pathLayer.frame = CGRectMake(0, 5, self.bounds.size.width, self.bounds.size.height);
pathLayer.path = path.CGPath;
pathLayer.strokeColor = [UIColor blackColor].CGColor;
pathLayer.fillColor = [UIColor clearColor].CGColor;
pathLayer.lineWidth = 5.0;
pathLayer.lineJoin = kCALineJoinRound;
创建一个渐变色图层
// 创建渐变图层
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.bounds;
gradientLayer.type = kCAGradientLayerConic;
// 定义颜色数组,中间白色,两边透明
NSArray *colors = @[(id)[UIColor colorWithWhite:1 alpha:1].CGColor,
(id)[UIColor colorWithWhite:0.8 alpha:0.8].CGColor,
(id)[UIColor colorWithWhite:0.6 alpha:0.6].CGColor,
(id)[UIColor colorWithWhite:0.5 alpha:0].CGColor,
(id)[UIColor colorWithWhite:0 alpha:0].CGColor,
(id)[UIColor colorWithWhite:0.5 alpha:0].CGColor,
(id)[UIColor colorWithWhite:0.6 alpha:0.6].CGColor,
(id)[UIColor colorWithWhite:0.8 alpha:0.8].CGColor,
(id)[UIColor colorWithWhite:1 alpha:1].CGColor];
gradientLayer.colors = colors;
gradientLayer.startPoint = CGPointMake(0.5, 0.5);
gradientLayer.endPoint = CGPointMake(0, 0.5);
// 设置颜色位置
gradientLayer.locations = @[@0.0, @0.05, @0.1, @0.15, @0.5, @0.85, @0.9, @0.95, @1.0];
将渐变图层添加到View的图层上,然后使用Shape图层进行mask切割,得出想要的图案。
mask的的原理:对应设置的图层中,如果像素是黑色的,其对应的下面的图层内容就显示,如果某部分图层像素是透明的,那么透明像素下面的图层内容就不展示。
[self.layer addSublayer:self.gradientLayer];
self.gradientLayer.mask = self.pathLayer;
开启渐变图层内容动画
将图层中的endPoint随时间进行线性移动,从而实现图层固定,里面的内容随时间进行动画。
- (void)createTimer {
gcdTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(gcdTimer, DISPATCH_TIME_NOW, 0.02 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC);
dispatch_source_set_event_handler(gcdTimer, ^{
dispatch_async(dispatch_get_main_queue(), ^{
[self handleTimerEvent];
});
});
dispatch_resume(gcdTimer);
} - (void)handleTimerEvent {
CGFloat speed = 0.04;
CGPoint endPoint = self.gradientLayer.endPoint;
if (endPoint.x <= 0 && endPoint.y > 0 && !self.leftMove) {
self.bottomMove = YES;
self.topMove = NO;
self.gradientLayer.endPoint = CGPointMake(endPoint.x, endPoint.y-speed);
} else if (endPoint.x < 1 && endPoint.y <= 0 && !self.topMove) {
self.leftMove = YES;
self.rightMove = NO;
self.gradientLayer.endPoint = CGPointMake(endPoint.x+speed, endPoint.y);
} else if (endPoint.x >= 1 && endPoint.y < 1 && !self.rightMove) {
self.topMove = YES;
self.bottomMove = NO;
self.gradientLayer.endPoint = CGPointMake(endPoint.x, endPoint.y+speed);
} else if (endPoint.x >= 0 && endPoint.y >= 1 && !self.bottomMove) {
self.rightMove = YES;
self.leftMove = NO;
self.gradientLayer.endPoint = CGPointMake(endPoint.x-speed, endPoint.y);
}
}
最终得到一个六边形,它的边框颜色是渐变色,并且这个渐变色沿着六边形旋转。

使用CAShapeLayer,UIBezierPath,CAGradientLayer构建边框颜色会旋转的六边形的更多相关文章

  1. 百度编辑器ueditor插入表格没有边框颜色的解决方法

    附:从word excel 中 复制的表格提交后无边框,参考这个同学的,写的很详细:   http://blog.csdn.net/lovelyelfpop/article/details/51678 ...

  2. input 边框颜色

    border 的属性 有三个 border:5px solid red; 如果上述值缺少一个没有关系,例如border:#FF0000;是允许的. 分别对应:border-width, border- ...

  3. winform设置button的边框颜色,或取消边框颜色,不显示边框

    // winform设置边框颜色不像webform那么简单,可以通过设置FlatAppearance,也可以通过重绘实现. 一.设置按钮本身属性 buttonBubufx.FlatStyle = Fl ...

  4. UIButton设置圆角和边框及边框颜色

    1. 按钮边框颜色 //设置边框颜色 [btn.layer setMasksToBounds:YES]; [btn.layer setCornerRadius:10.0]; //设置矩形四个圆角半径 ...

  5. JAVA swing中JPanel如何实现分组框的效果以及设置边框颜色 分类: Java Game 2014-08-16 12:21 198人阅读 评论(0) 收藏

    代码如下: import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridLayout; import javax.sw ...

  6. 为UITextView添加与UITextField一样的边框——UITextField默认边框颜色、宽度、圆角

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3789052.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  7. HTML快速入门5——不规则表格、表格背景、边框颜色

    转自:http://blog.csdn.net/ysuncn/article/details/2214153 不规则表格 例子: <table border=1><tr>< ...

  8. Winform改变Textbox边框颜色(转)

    namespace MyTextBoxOne { //使用时必须把文本框的BorderStyle为FixedSingle才能使用 //一些控件(如TextBox.Button等)是由系统进程绘制,重载 ...

  9. 鼠标点击 input,显示瞬间的边框颜色,对之修改与隐藏

    示例的是项目中的遇到的,要做成的效果是点击该图片按钮,达到切换图片的效果: HTML代码如下: <input class="dBox3Ulimg" type="im ...

  10. html中如何修改选中 用input做的搜索框 的边框颜色

    html中如何修改选中 用input做的搜索框 的边框颜色 如图,当我鼠标选中输入框时,内边框会变成蓝色 我的问题是: 1.如何把蓝色去掉? 2.如何改成别的颜色? 首先感谢 UI设计师提出的需求,解 ...

随机推荐

  1. JSP 学习笔记 | 二、JSP 脚本 & 案例实现 & 缺点分析

    前文:JSP 学习笔记 | 一.JSP 原理理解 JSP脚本用于在 JSP页面内定义 Java代码.很多入门案例中我们就在 JSP 页面定义的 Java 代码就是 JSP 脚本. JSP 脚本分类 J ...

  2. 6、SpringBoot-mybatis分页实现pagehelper

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  3. 高级数据结构---B树和B+树及mysql索引分析

    mysql索引数据结构:https://www.cnblogs.com/nijunyang/p/11406688.html 几种树结构的对比: 二叉查找树:二叉搜索树,二叉排序树,优点查找快,但是在某 ...

  4. freeswitch的gateway配置方案优化

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在之前的文章中,我们简单介绍过gateway的三种配置方案,但是实际应用之后发现,方案中的参数设置有缺陷,会导致一些问题. 本文档中 ...

  5. ASP.NET Core 5.0 MVC 视图组件的用法

    什么是视图组件 视图组件与分部视图类似,但它们的功能更加强大. 视图组件不使用模型绑定,并且仅依赖调用时提供的数据.它也适用于 Razor 页. 视图组件: 呈现一个区块而不是整个响应. 包括控制器和 ...

  6. React技巧之设置input值

    原文链接:https://bobbyhadz.com/blog/react-set-input-value-on-button-click 作者:Borislav Hadzhiev 正文从这开始~ 总 ...

  7. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.14)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  8. [转帖]java乱码 java使用的编码是utf-8还是utf-16还是unicode

    简单介绍编码 Unicode:是容纳世界所有文字符号的国标标准编码,使用四个字节为每个字符编码 UTF:是英文 Unicode Transformation Format 的缩写,意为把 Unicod ...

  9. [转帖]Jmeter中如何读取MYSQL数据作为请求参数

    在项目测试过程中,我经常需要将数据库中的数据作为参数传递到请求中.Jmeter中MYSQL数据库连接操作过程如下: 1.下载/n导入mysql的jdbc驱动包 下载mysql驱动包地址: http:/ ...

  10. [转帖]auto_explain

    https://help.kingbase.com.cn/v8/development/sql-plsql/ref-extended-plug-in/auto_explain.html 6.1. 插件 ...