快速上手IOS UIBezierPath(贝塞尔曲线)
发布时间 - 2026-01-11 00:14:12 点击率:次UIBezierPath主要用来绘制矢量图形,它是基于Core Graphics对CGPathRef数据类型和path绘图属性的一个封装,所以是需要图形上下文的(CGContextRef),所以一般UIBezierPath在drawRect中使用。

使用方法
UIBezierPath 是对 CGPathRef 的封装。创建矢量图形时,拆解成一或多条线段,拼接起来,每条线段的终点都是下一条线段的起点。
具体地:
1.创建一个 UIBezierPath 对象
2.用 moveToPoint: 设置初始线段的起点
3.添加线段,定义一或多个子路径
4.修改 UIBezierPath 的绘图相关的属性,比如stroke path的属性 lineWidth 和 lineJoinStyle ,filled path的属性 usesEvenOddFillRule
注意:如果是矩形或者圆之类的特殊图形,可以不用第2步。
代码案例
画直线
UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(50, 50)]; [path addLineToPoint:CGPointMake(100, 50)]; path.lineWidth = 5.0f; path.lineJoinStyle = kCGLineJoinRound; [path stroke];
创建三角形
UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(50, 50)]; [path addLineToPoint:CGPointMake(300, 50)]; [path addLineToPoint:CGPointMake(200, 150)]; // 最后的闭合线是可以通过调用closePath方法来自动生成的,也可以调用-addLineToPoint:方法来添加 // [path addLineToPoint:CGPointMake(50, 50)]; [path closePath]; path.lineWidth = 5.0f; [path stroke];
创建矩形
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(50, 100, 50, 50)]; path.lineWidth = 5.0f; [path stroke];
创建内切曲线
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 200, 50, 50)]; path.lineWidth = 5.0f; [path stroke];
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 200, 50, 100)]; path.lineWidth = 5.0f; [path stroke];
创建带有圆角的矩形,当矩形变成正圆的时候,Radius就不再起作用
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50, 300, 50, 50) cornerRadius:15.0f]; path.lineWidth = 5.0f; [path stroke];
设定特定的角为圆角的矩形
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50, 400, 50, 50) byRoundingCorners:UIRectCornerBottomLeft cornerRadii:CGSizeMake(5,5)]; path.lineWidth = 5.0f; [path stroke];
创建圆弧
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 550) radius:25 startAngle:0 endAngle:1.5*M_PI clockwise:YES]; path.lineWidth = 5.0f; [path stroke];
通过路径A创建路径B
UIBezierPath *path_A = [UIBezierPath bezierPath]; [path_A moveToPoint:CGPointMake(200, 50)]; [path_A addLineToPoint:CGPointMake(250, 100)]; path_A.lineWidth = 5.0f; UIBezierPath *path_B = [UIBezierPath bezierPathWithCGPath:path_A.CGPath]; [path_B stroke];
创建三次贝塞尔曲线
UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(100, 200)]; [path addCurveToPoint:CGPointMake(300, 200) controlPoint1:CGPointMake(150, 150) controlPoint2:CGPointMake(250, 250)]; [path stroke];
创建二次贝塞尔曲线
UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(100, 200)]; [path addQuadCurveToPoint:CGPointMake(300, 200) controlPoint:CGPointMake(150, 150)]; [path stroke];
添加圆弧
UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(200, 400)]; [path addLineToPoint:CGPointMake(225, 410)]; [path addArcWithCenter:CGPointMake(200, 400) radius:25 startAngle:0 endAngle:1.5*M_PI clockwise:YES]; // [path closePath]; // [path removeAllPoints]; [path stroke];
追加路径
UIBezierPath *path_A = [UIBezierPath bezierPath]; [path_A moveToPoint:CGPointMake(200, 500)]; [path_A addLineToPoint:CGPointMake(225, 410)]; UIBezierPath *path_B = [UIBezierPath bezierPath]; [path_B moveToPoint:CGPointMake(200, 600)]; [path_B addLineToPoint:CGPointMake(225, 500)]; [path_A appendPath:path_B]; [path_A stroke];
创建翻转路径,即起点变成终点,终点变成起点
UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(50, 50)]; [path addLineToPoint:CGPointMake(100, 50)]; path.lineWidth = 5.0f; NSLog(@"%@",NSStringFromCGPoint(path.currentPoint)); UIBezierPath *path_b = [path bezierPathByReversingPath]; CGAffineTransform transform = CGAffineTransformMakeTranslation(200, 0); [path_b applyTransform: transform]; // 两条路径分别添加一条直接到 self.center [path addLineToPoint: CGPointMake(self.frame.size.width*0.5, self.frame.size.height*0.5)]; [path_b addLineToPoint: CGPointMake(self.frame.size.width*0.5, self.frame.size.height*0.5)]; NSLog(@"%@",NSStringFromCGPoint(path_b.currentPoint)); [[UIColor redColor] set]; [path stroke]; [[UIColor blueColor] set]; [path_b stroke];
路径进行仿射变换
UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(100, 50)]; [path addLineToPoint:CGPointMake(200, 50)]; CGAffineTransform transform = CGAffineTransformRotate(self.transform, M_PI_4); [path applyTransform:transform]; path.lineWidth = 5.0f; [path stroke];
创建虚线
CGFloat dashStyle[] = {1.0f, 2.0f};
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(50, 50)];
[path addLineToPoint:CGPointMake(100, 50)];
[path setLineDash:dashStyle count:2 phase:0.0];
[path stroke];
设置颜色
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 100, 100, 100)]; [[UIColor greenColor] setStroke]; [[UIColor redColor] setFill]; [path stroke]; [path fill];
设置描边混合模式
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 100, 100, 100)]; [[UIColor greenColor] setStroke]; path.lineWidth = 10.0f; [path strokeWithBlendMode:kCGBlendModeSaturation alpha:1.0]; [path stroke];
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 100, 100, 100)]; [[UIColor redColor] setFill]; [path fillWithBlendMode:kCGBlendModeSaturation alpha:0.6]; [path fill];
修改当前图形上下文的绘图区域可见,随后的绘图操作导致呈现内容只有发生在指定路径的填充区域
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 100, 100, 100)]; [[UIColor greenColor] setStroke]; [path addClip]; [path stroke];
结语
关于UIBezierPath的简单介绍就到这了,主要是用代码做了展示,属性跟方法,没详细去介绍,我觉得可以直接看苹果的api写的也蛮清楚的.或者自己试试不同的参数样式也能大概理解了.
核心动画跟贝赛尔曲线都有了简单的介绍了,接下来就可以动手做点简单的自定义动画了.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# uibezierpath
# ios
# 贝塞尔曲线
# 贝塞尔曲线案例
# ios 贝塞尔曲线切割圆角的方法
# iOS贝塞尔曲线画哆啦A梦的代码实例
# IOS 贝塞尔曲线(UIBezierPath)属性、方法整理
# iOS实现贝塞尔曲线动画
# 方法来
# 塞尔
# 都是
# 圆角
# 角形
# 我觉得
# 就不
# 也能
# 它是
# 可以通过
# 可以直接
# 自定义
# 两条
# 就到
# 每条
# 创建一个
# 多条
# 自动生成
# 画了
# 做点
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python进程池调度策略_任务分发说明【指导】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel如何升级到最新版本?(升级指南和步骤)
如何用JavaScript实现文本编辑器_光标和选区怎么处理
java中使用zxing批量生成二维码立牌
如何在阿里云虚拟主机上快速搭建个人网站?
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
如何彻底删除建站之星生成的Banner?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何安全更换建站之星模板并保留数据?
Python文件流缓冲机制_IO性能解析【教程】
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何在阿里云服务器自主搭建网站?
Python正则表达式进阶教程_复杂匹配与分组替换解析
iOS UIView常见属性方法小结
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
,在苏州找工作,上哪个网站比较好?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
深圳网站制作的公司有哪些,dido官方网站?
高防服务器租用首荐平台,企业级优惠套餐快速部署
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
制作旅游网站html,怎样注册旅游网站?
如何用西部建站助手快速创建专业网站?
Bootstrap整体框架之JavaScript插件架构
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
教你用AI润色文章,让你的文字表达更专业
如何快速配置高效服务器建站软件?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
如何在建站宝盒中设置产品搜索功能?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
,怎么在广州志愿者网站注册?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel如何处理文件下载请求?(Response示例)
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
lovemo网页版地址 lovemo官网手机登录
如何获取免费开源的自助建站系统源码?
Swift中swift中的switch 语句
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何快速搭建自助建站会员专属系统?

