UIKit中的UIBezierPath是Core Graphics框架关于path的一个封装。可以创建基于矢量的路径,例如椭圆或者矩形,或者有多个直线和曲线段组成的形状.
属性
lineWidth
:线宽属性定义了UIBezierPath
对象中绘制的曲线规格. 默认为: 1.0lineCapStyle
:应用于曲线的终点和起点. 该属性在一个闭合子路经中是无效果的. 默认为: kCGLineCapButt
枚举值:
1 | typedef CF_ENUM(int32_t, CGLineCap) { |
对应样式:
lineJoinStyle
:曲线连接点的样式.
枚举值:
1 | typedef CF_ENUM(int32_t, CGLineJoin) { |
对应样式:
miterLimit
:两条线交汇处内角和外角之间的最大距离, 仅当连接点样式为 kCGLineJoinMiter时生效.
图解如下
flatness
:渲染精度(表示真实曲线的点和渲染曲线的点的最大允许距离)。值越小,精度越高。default:0.6。usesEvenOddFillRule
:是否使用基偶填充规则。两种规则的详细介绍
1 | 设置为 YES, 则路径将会使用 基偶规则 (even-odd) 进行填充. |
CGPath
:一个不可变的 CGPathRef 对象
1 | 他可以传入 CoreGraphics 提供的函数中你可以是用 CoreGraphics 框架提供的方法创建一个路径, 并给这个属性赋值, 当时设置了一个新的路径后, 这个将会对你给出的路径对象进行 Copy 操作 |
currentPoint
:下一条绘制的直线或曲线的起始点。如果当前路径为空, 那么该属性的值将会是 CGPointZerobounds
:路径覆盖的矩形区域。该属性描述的是一个能够完全包含路径中所有点的一个最小的矩形区域. 该区域包含二次贝塞尔曲线和三次贝塞尔曲线的控制点.empty
:路径是否为空。 <注>: 就算你仅仅调用了 moveToPoint 方法那么当前路径也被看做不为空.
创建实例对象
- 创建
1 | + (instancetype) bezierPath; |
- by 矩形
1 | /** |
- by 椭圆
1 | /** |
- by 圆角矩形:
1 | /** |
可以指定矩形的哪个角为圆角:
1 | /** |
- by 圆弧
1 | /** |
)
- by CGPath
1 | + (instancetype) bezierPathWithCGPath:(CGPathRef)CGPath; |
- by 反方向Path(这里的方向是指绘制方向)。
1 | /** |
构造或添加路径
- 将对象的
currentPoint
移到某个点。(对于大多数构造路径相关的方法而言, 在你绘制直线或曲线之前, 需要先调用这个方法.)
1 | /** |
- 追加
一条直线
1 | /** |
- 追加
一条圆弧
1 | /** |
- 追加
一条三次贝塞尔曲线
1 | /** |
图解如下:
)
- 追加
一条二次贝塞尔曲线
:
1 | /** |
图解如下:
- 追加 UIBezierPath 实例对象
1 | /** |
虚线路径
- 构建一条虚线路径:
1 | /** |
- 获取虚线的模式:
1 | /** |
尝试Demo
1 | - (void) typeDashLine { |
显示效果:
)
更改路径
- 关闭当前子路径
1 | /** |
- 删除
UIBezierPath
对象中的所有点, 效果也就等同于删除了所有子路经:
1 | - (void)removeAllPoints; |
- 剪切路径
1 | /** |
- 放射变换操作
1 | /** |
绘制相关
- 填充路径:
1 | /** |
- 使用混合模式填充路径
1 | /** |
- 绘制路径:(一般用于将路径相关设置完成后的最后一步操作).
1 | - (void)stroke; |
判断方法
- 是否包含某个点
1 | /** |
Demo实例
- 属性方法简单应用:
1 |
|
CAShapeLayer
属性介绍:
大多属性和UIBezierPath的属性类似。
path
: CGPathRef 对象,图形边线路径。fillColor
:CGColorRef对象,图形填充色,默认为黑色。fillRule
:填充规则。类似于UIBezierPath的fillMode
属性。
kCAFillRuleNonZero : 非零环绕数规则。
这个规则通过从canvas上的某个点往任一方向绘制射线到无穷远,然后检查图形的线段和射线相交的点,来确定“内部区域”。从0
开始计数,每次路径线段是从左到右穿过射线就加一,从右到左的就减一。通过计算交叉点,如果结果是0
,则这个点在路径外边,不然,就是在里边。
[图片上传失败…(image-4ee41e-1552033143799)]
kCAFillRuleEvenOdd : 奇偶原则。
通过从canvas上某个点往任一方向绘制射线到无穷远,然后计算给定图形上线段路径和该射线交叉点的数量。如果这个数是奇数,那么该点在图形内部;如果是偶数,该点在图形外部。
[图片上传失败…(image-53b934-1552033143799)]
strokeColor
:边线颜色。lineDashPhase
:边线样式的起始位置,即,如果lineDashPattern设置为@[2,2,3,4], lineDashPhase即为第一个长度为2的线的起始位置。strokeStart
,strokeEnd
: [0,1]表示画边线的起点和终点。lineDashPattern
: NSNumber数组,依次表示单个线的长度和空白的长度。
####DEMO
1 | // 创建一个路径对象 |
更多Demo可见关于贝塞尔曲线与CAShapeLayer的学习
####总结:
UIBezierPath
在当前的绘图上下文中绘制图形了. 因为创建、 配置、 渲染路径等操作, 都是完全不同的步骤, 所以你可以在你的代码中非常容易的对UIBezierPath
对象进行复用. 你甚至可以使用同一个 UIBezierPath
对象去渲染同一个图形很多次, 你也可以再多次渲染的间隔中, 修改属性来渲染出不同样式的路径.
当你为UIBezierPath
对象配置完几何路径
和绘图属性
之后, 你就可以使用stroke
和 fill
方法在当前的绘图上下文中进行绘制了. stroke
方法将会使用当前的strokeColor
和 绘图属性
来描绘曲线的轮廓. 同样的, fill
方法将会使用fillColor
来填充路径所围成的图形(使用UIColor
类方法来设置strokeColor
和 fillColor
).