前言

最近要写个「会话气泡」,由于没有找到合适的背景图片,所以需要直接用 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
  • 确定绘制方向 clockwise
    • 如果设置 clockwise 为 YES (顺时针)
    • 如果设置 clockwise 为 NO (逆时针),显然这是我们需要的结果。

最终版参考代码如下:

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 绘制圆弧相关推荐

  1. ios开发 方形到圆的动画_iOS利用UIBezierPath + CAAnimation实现路径动画效果

    前言 上次给大家介绍了iOS利用UIBezierPath + CAAnimation实现路径动画效果的相关内容,今天实现一个根据心跳路径实现一个路径动画,让某一视图沿着路径进行运动.. 效果图如下: ...

  2. 利用 CoreGraphics 绘制折线图

    效果与元素分析 实现效果图如下: 首先对折线图进行元素分割 包含以下六部分元素 渐变背景 折线 折线上的点 折线范围内渐变 参考线 文本显示的 Label 除了6之外,其他几个元素都在 draw(_: ...

  3. 深入理解UIBezierPath画圆弧addArcWithCenter

    UIBezierPath画圆弧的方法 - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFlo ...

  4. 用easyx画电子钟_Canvas入门-利用Canvas绘制好玩的电子时钟

    在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...

  5. 模拟PLC 的圆弧插补方式在VC中绘制圆弧

    最近同事想让要做一个绘图的控件.VC里面的画弧函数Arc需要提供外接矩形的坐标.同事觉得不好用,他更习惯圆弧插补的那种方式.于是看了看圆弧插补的东西.其实这种画弧方式就是提供圆弧的起点.终点和半径来画 ...

  6. Canvas入门-利用Canvas绘制好玩的电子时钟

    在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...

  7. html5绘制图形幸运大转盘,微信小程序利用canvas 绘制幸运大转盘功能

    小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码 Page({ /** * 页面的初始数据 */ data: { awardsConfig: {}, resta ...

  8. 前端画圆弧html弧线的像素,使用canvas绘制圆弧动画

    效果预览 canvas 绘制基本流程 初始画布 对于canvas的绘制,首先需要在html内指定一块画布,即, 可以看做是在PS中新建一个空白文档,之后所有的操作都将呈现在这个文档之上,与PS的区别是 ...

  9. c语言圆弧插补源代码,模拟PLC 的圆弧插补方式在VC中绘制圆弧

    最近同事想让要做一个绘图的控件.VC里面的画弧函数Arc需要提供外接矩形的坐标.同事觉得不好用,他更习惯圆弧插补的那种方式.于是看了看圆弧插补的东西.其实这种画弧方式就是提供圆弧的起点.终点和半径来画 ...

最新文章

  1. R计算贝叶斯信息指标(Bayesian Information Criterion,BIC)实战
  2. jQuery validate 如何清除remote验证的缓存 (在select验证时这个bug尤为明显)
  3. Restful风格,PUT修改功能请求,表单中存在文件报错-HTTP Status 405 - Request method 'POST' not supported...
  4. 解决 A component required a bean of ‘XXX.RoleService‘ that could not be found.
  5. 设计模式之美:Strategy(策略) -未经作者同意的转载
  6. opencv 图像傅里叶变换
  7. Ajax调用服务器端C#方法
  8. vivo android 刷机教程,VIVOX21原厂官方固件刷机教程_线刷|救砖教程图解
  9. 单片机c语言必背代码_stm32单片机编程用库函数好还是寄存器好?
  10. 查看Android打包时签名文件keystore的MD5值
  11. 团队成立——Microhard
  12. c 实现走迷宫流程图_迷宫求解(有流程图).doc
  13. 课程实验三-bomb实验
  14. 一个公司存在不同职位,不同职位计算工资的方法也不相同。工资可能是固定的,也可能根据销售额或工作量来计算。假设公司有三种职务:经理、计件工人和计时工人:他们的工资组成分别为:
  15. 高德地图 定位失败,10: 定位服务启动失败 解决办法
  16. 宜品优享抽奖系统小程序,多方式真是展示抽奖功能
  17. 考研期间复习时间记录
  18. mysql采集方式_数据采集的几种方法
  19. 超声平面波复合成像仿真(ultrasound plane_wave compound imaging simulation)
  20. 新版本 印象笔记 markdown语法大全 !!!

热门文章

  1. [ARM异常]-ARMV8-aarch64 异常(中断)是如何跳转到向量表的
  2. MultiByteToWideChar和WideCharToMultiByte
  3. Python实现换位加密
  4. OSX 使用“终端”远程登录linux主机
  5. 1.4 Float类
  6. Python中list、set和tuple
  7. php主机转发ipv6,php实现ipv4转换ipv6
  8. centos云服务器开放端口和域名解析(8080、80等)
  9. 为什么程序员都不喜欢使用switch,而是大量的 if……else if ?
  10. Java集合中的排序API分析