iOS - 利用 UIBezierPath 绘制圆弧
前言
最近要写个「会话气泡」,由于没有找到合适的背景图片,所以需要直接用 UIBezierPath 进行绘制。期间用到之前还不太熟悉的绘制圆弧相关知识,于是写下此文进行记录。
API 浅析
UIBezierPath 绘制圆弧主要利用以下方法:
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radiusstartAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise
方法中各参数含义:
- center:圆心
- radius:半径
- startAngle:开始弧度
- endAngle:结束弧度
- clockwise:绘制方向,YES 为顺时针,NO 为逆时针
相关参数的含义可以参考下图:
其实这还是比较容易理解的,要想一段圆弧,就得确定圆上的两点,然后选择某个方向(顺时针或逆时针)来连接两点。而确定圆上的点,可以通过确定圆心、半径和角度(或弧度)来实现。
看到这里,你大概理解理解这个 API 的使用了,但是 startAngle,endAngle 的传值是弧度,如果你不理解弧度的表示的话,可能你还是无法使用。
弧度的表示
弧度的表示其实在高中已经学过了,这里就简单复习一下。
其实圆上的一个弧度有两种表示方法,顺时针(正方向)一种,逆时针(负方向)一种。可以参考下文图示以及文字描述:
- 从0 PI 的点开始顺时针数算是正方向的弧度,用正数表示
- 从0 PI 的点开始逆时针数算是反方向的弧度,用负数表示
注:PI 表示 π\piπ
下面这些系统提供的宏,能帮助我们方便的表示圆上任意点的弧度。
#define M_PI 3.14159265358979323846264338327950288 /* pi */
#define M_PI_2 1.57079632679489661923132169163975144 /* pi/2 */
#define M_PI_4 0.785398163397448309615660845819875721 /* pi/4 */
实战演练
我们要利用 UIBezierPath 绘制如下图形。
我们将重点放在后面的圆弧绘制部分。可以按照如下步骤:
- 确定圆心 center
- 确定半径 radius
- 确定起点和终点 startAngle,endAngle
我们可以有如下设置- startAngle 为
M_PI
或-M_PI
- endAngle 为
1.5 * M_PI
或-0.5 * M_PI
- startAngle 为
- 确定绘制方向 clockwise
- 如果设置 clockwise 为
YES
(顺时针)
- 如果设置 clockwise 为
NO
(逆时针),显然这是我们需要的结果。
- 如果设置 clockwise 为
最终版参考代码如下:
CGFloat radius = 40;
CGPoint startPoint = CGPointMake(50, 200);
CGPoint endPoint = CGPointMake(150, 200);
CGPoint centerPoint = CGPointMake(150 + radius, 200);UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:startPoint];
[path addLineToPoint:endPoint];
[path addArcWithCenter:centerPoint radius:radius startAngle:M_PI endAngle:1.5 * M_PI clockwise:NO];CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = path.CGPath;
layer.fillColor = [UIColor clearColor].CGColor;
layer.strokeColor = [UIColor blueColor].CGColor;[self.view.layer addSublayer:layer];
参考链接
- https://www.jianshu.com/p/5e96e754d9cb
iOS - 利用 UIBezierPath 绘制圆弧相关推荐
- ios开发 方形到圆的动画_iOS利用UIBezierPath + CAAnimation实现路径动画效果
前言 上次给大家介绍了iOS利用UIBezierPath + CAAnimation实现路径动画效果的相关内容,今天实现一个根据心跳路径实现一个路径动画,让某一视图沿着路径进行运动.. 效果图如下: ...
- 利用 CoreGraphics 绘制折线图
效果与元素分析 实现效果图如下: 首先对折线图进行元素分割 包含以下六部分元素 渐变背景 折线 折线上的点 折线范围内渐变 参考线 文本显示的 Label 除了6之外,其他几个元素都在 draw(_: ...
- 深入理解UIBezierPath画圆弧addArcWithCenter
UIBezierPath画圆弧的方法 - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFlo ...
- 用easyx画电子钟_Canvas入门-利用Canvas绘制好玩的电子时钟
在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...
- 模拟PLC 的圆弧插补方式在VC中绘制圆弧
最近同事想让要做一个绘图的控件.VC里面的画弧函数Arc需要提供外接矩形的坐标.同事觉得不好用,他更习惯圆弧插补的那种方式.于是看了看圆弧插补的东西.其实这种画弧方式就是提供圆弧的起点.终点和半径来画 ...
- Canvas入门-利用Canvas绘制好玩的电子时钟
在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...
- html5绘制图形幸运大转盘,微信小程序利用canvas 绘制幸运大转盘功能
小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码 Page({ /** * 页面的初始数据 */ data: { awardsConfig: {}, resta ...
- 前端画圆弧html弧线的像素,使用canvas绘制圆弧动画
效果预览 canvas 绘制基本流程 初始画布 对于canvas的绘制,首先需要在html内指定一块画布,即, 可以看做是在PS中新建一个空白文档,之后所有的操作都将呈现在这个文档之上,与PS的区别是 ...
- c语言圆弧插补源代码,模拟PLC 的圆弧插补方式在VC中绘制圆弧
最近同事想让要做一个绘图的控件.VC里面的画弧函数Arc需要提供外接矩形的坐标.同事觉得不好用,他更习惯圆弧插补的那种方式.于是看了看圆弧插补的东西.其实这种画弧方式就是提供圆弧的起点.终点和半径来画 ...
最新文章
- R计算贝叶斯信息指标(Bayesian Information Criterion,BIC)实战
- jQuery validate 如何清除remote验证的缓存 (在select验证时这个bug尤为明显)
- Restful风格,PUT修改功能请求,表单中存在文件报错-HTTP Status 405 - Request method 'POST' not supported...
- 解决 A component required a bean of ‘XXX.RoleService‘ that could not be found.
- 设计模式之美:Strategy(策略) -未经作者同意的转载
- opencv 图像傅里叶变换
- Ajax调用服务器端C#方法
- vivo android 刷机教程,VIVOX21原厂官方固件刷机教程_线刷|救砖教程图解
- 单片机c语言必背代码_stm32单片机编程用库函数好还是寄存器好?
- 查看Android打包时签名文件keystore的MD5值
- 团队成立——Microhard
- c 实现走迷宫流程图_迷宫求解(有流程图).doc
- 课程实验三-bomb实验
- 一个公司存在不同职位,不同职位计算工资的方法也不相同。工资可能是固定的,也可能根据销售额或工作量来计算。假设公司有三种职务:经理、计件工人和计时工人:他们的工资组成分别为:
- 高德地图 定位失败,10: 定位服务启动失败 解决办法
- 宜品优享抽奖系统小程序,多方式真是展示抽奖功能
- 考研期间复习时间记录
- mysql采集方式_数据采集的几种方法
- 超声平面波复合成像仿真(ultrasound plane_wave compound imaging simulation)
- 新版本 印象笔记 markdown语法大全 !!!
热门文章
- [ARM异常]-ARMV8-aarch64 异常(中断)是如何跳转到向量表的
- MultiByteToWideChar和WideCharToMultiByte
- Python实现换位加密
- OSX 使用“终端”远程登录linux主机
- 1.4 Float类
- Python中list、set和tuple
- php主机转发ipv6,php实现ipv4转换ipv6
- centos云服务器开放端口和域名解析(8080、80等)
- 为什么程序员都不喜欢使用switch,而是大量的 if……else if ?
- Java集合中的排序API分析