在自定义View的时候,可以使用贝塞尔曲线(UIBezierPath)类来实现直线和曲线的绘制和渲染,起初是使用贝塞尔曲线是定义路径的几何形状。贝塞尔曲线可以定义矩形、椭圆和圆形等简单形状或者是融合直线和曲线的多边形,并且可以调用该类中的一些方法在当前上下文中渲染定义完的路径形状。
贝塞尔曲线包括了曲线的几何形状以及路径渲染所需的一些属性,对于形状和渲染属性可以分别独立设计并且可以可以分别改变两者的属性值。一旦你按照需要配置好了贝塞尔曲线,就可以当前上下文中绘制路径。因为贝塞尔曲线的创建、配置和渲染过程属于不同的阶段,所以贝塞尔曲线的代码可以复用。可以重复使用同一个对象多次绘制相同的形状,可以在绘制的时候改变渲染的方式。
可以通过控制曲线的current point来确定路径的几何形状。当你创建一个新的路径对象的时候,需要明确的定义它的current point。调用moveToPoint:
方法来设置曲线的起点。所有其他方法都是增添一条新的曲线,而这些方法都是假设你在当前点的基础上并且在某一个确定好的点结束。当添加了这段曲线之后,之前的结束点就会成为一个新的起始点。
单个贝塞尔曲线包含任意数量的开放或者封闭的子路径,而这些子路径又是一系列路径元素的组合。调用closePath
方法会在当前点和子路径的第一个点之间形成一条直线来封闭这条子路径。moveToPoint:
结束当前路径并设置新一段路径的起始点。贝塞尔曲线的子路径对象拥有相同的属性,如果想绘制不同的子路径,每段子路径都应该是重新创建的新的UIBezierPath
对象。
配置完贝塞尔曲线的形状和属性之后,需要调用stroke
和fill
方法在当前图形上下文中绘制曲线。stroke
方法会用当前stroke color
来描绘图形的边框,用fill color
来绘制曲线所围成区域的颜色(利用UIColor
来设置边线和曲线区域颜色)。
可以使用贝塞尔曲线绘制新的形状,也可以用来定义一个新的剪彩区域。addClip
方法会得到路径对象和剪裁区域相交的区域。在后续的绘制过程当中,只有新的相交区域内的会被渲染到图形上下文上。
一些方法
-
+ bezierPath
方法会创建一个新的UIBezierPath
对象。 -
+ (instancetype)bezierPathWithRect:(CGRect)rect
——rect
表示的是创建路径的矩形区域。这个方法会创建一条封闭的以rect
的原点为起点的顺时针方向的子路径。 -
+ bezierPathWithOvalInRect:
返回一条具体矩形区域的椭圆曲线。如果矩形是长方形,那么绘制的曲线是椭圆形曲线;但如果矩形是正方形那么绘制出来的曲线就是圆形。 -
+ bezierPathWithRoundedRect:cornerRadius:
创建一个圆角矩形路径。rect
定义了曲线的区域,而cornerRadius
则定义每个圆角的弧度半径。值为0的时候表示正常的矩形。
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center
radius:(CGFloat)radius
startAngle:(CGFloat)startAngle
endAngle:(CGFloat)endAngle
clockwise:(BOOL)clockwise
这个方法可以创建一个开口的子路径。创建的弧是一个确定的圆的部分。当在默认的坐标系统绘制的时候,开始和结束的弧度表示如上图所示。例如,定义一个起始弧度值为0,结束弧度值为π,并且设置clockwise = YES
(表示顺时针方向),绘制的形状是圆形的下半部分。但是,如果以同样的起始点和结束点,但是设置的colckwise = NO
(逆时针方向)的时候,绘制的图形为圆形的上半圆。
-
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath
设置一个有着特定路径的曲线。
确定路径
- (void)moveToPoint:(CGPoint)point
将曲线的起点绘制到指定的点。
- (void)addLineToPoint:(CGPoint)point
这个方法会返回一条直线,以起始点开始,并且在指定的点point
结束,在调用这个方法之前,需要给曲线设置起始点(调用moveToPoint:
方法)
- (void)addArcWithCenter:(CGPoint)center
radius:(CGFloat)radius
startAngle:(CGFloat)startAngle
endAngle:(CGFloat)endAngle
clockwise:(BOOL)clockwise
下图基本介绍了以给定点为基础生成的贝塞尔曲线,贝塞尔曲线和初始点之间有着复杂的数学关系表达式,而且网络上有很详细的介绍。
- (void)addQuadCurveToPoint:(CGPoint)endPoint
controlPoint:(CGPoint)controlPoint
存在一个控制点的时候,在给定路径的基础上生成一条贝塞尔曲线。
这个方法会在当前起始点和终点(endPoint
)之间形成一条贝塞尔曲线,当前点、终点、控制点之间的关系才形成了贝塞尔曲线。
在调用这个方法之前,你必须已经确定了当前点(通过moveToPoint:
或者是之前创建的一些曲线),如果没有路径的话,这个方法是不会起到任何作用的。添加了曲线段之后,当前点就会变为point
。
@property(nonatomic) CGFloat lineWidth
这个属性定义了曲线的线段宽度。宽度为0则表示渲染的最细的线条。