简介
UIBezierPath
这个类在UIKit
中, 是CoreGraphics
框架关于路径(path)的一个封装,使用此类可以定义简单的形状,比如我们常用到,矩形,圆形,椭圆,弧,或者不规则的多边形。
使用
初始化
// 空path初始化
UIBezierPath *path = [UIBezierPath bezierPath];
// 以"矩形路径"初始化一个UIBezierPath对象
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(20, 20, 200, 100)];
// 以"内切于一个矩形的椭圆路径"初始化一个UIBezierPath对象
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(20, 20, 200, 100)];
/*
* 以"圆角矩形路径"初始化一个UIBezierPath对象
* 参数一: 矩形范围
* 参数二: 圆角半径, 如果半径大于矩形短边的一半, 则按照一半处理
*/
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 200, 100) cornerRadius:30];
/*
* 以"可选圆弧位置的圆角矩形路径"初始化一个UIBezierPath对象
* 参数一: 矩形范围
* 参数二: 圆弧位置, 可以多选
* 参数三: 圆弧半径, 如果半径大于矩形短边的一半, 则按照一半处理, CGSize以小的为准(自己试的, 文档没说)
*/
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 200, 100) byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(30, 50)];
/*
* 以"圆弧路径"初始化一个UIBezierPath对象
* 参数一: 圆弧圆心
* 参数二: 圆弧半径
* 参数三: 开始弧度
* 参数四: 结束弧度
* 参数五: 是否为顺时针
*/
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:50 startAngle:0 endAngle:M_PI clockwise:YES];
绘制
- 画线
// 将当前点移动到指定的位置
- (void)moveToPoint:(CGPoint)point
// 在路径中增加一条直线
- (void)addLineToPoint:(CGPoint)point
- 画圆弧
/*
* 在路径中增加一条圆弧
* 参数一: 圆弧圆心
* 参数二: 圆弧半径
* 参数三: 开始弧度
* 参数四: 结束弧度
* 参数五: 是否为顺时针
*/
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise
- 增加一条二次贝塞尔曲线
/*
* 在路径中增加一条二次贝塞尔曲线
* 参数一: 曲线的终点位置
* 参数二: 控制点
*/
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint
- 增加一条三次贝塞尔曲线
/*
* 在路径中增加一条三次贝塞尔曲线
* 参数一: 曲线的终点位置
* 参数二: 第一控制点
* 参数三: 第二控制点
*/
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2
属性
- 基础属性
// 与之对应的CGPath
@property(nonatomic) CGPathRef CGPath;
// 是否为空
@property(readonly,getter=isEmpty) BOOL empty;
// 整个路径相对于原点的位置及宽高
@property(nonatomic,readonly) CGRect bounds;
// 当前画笔位置
@property(nonatomic,readonly) CGPoint currentPoint;
// 两条线交汇处内角和外角之间的最大距离,需要交叉点类型为kCGLineJoinMiter是生效,最大限制为10
@property(nonatomic) CGFloat miterLimit;
// 个人理解为绘线的精细程度,默认为0.6,数值越大,需要处理的时间越长
@property(nonatomic) CGFloat flatness;
// 决定使用even-odd或者non-zero规则
@property(nonatomic) BOOL usesEvenOddFillRule;
- 线宽
// 线宽
@property(nonatomic) CGFloat lineWidth;
- 终点类型
// 路径终点类型
@property(nonatomic) CGLineCap lineCapStyle;
typedef CF_ENUM(int32_t, CGLineCap) {
kCGLineCapButt, //粗点
kCGLineCapRound, // 圆
kCGLineCapSquare // 方形
};
- 交叉点的类型
// 交叉点的类型
@property(nonatomic) CGLineJoin lineJoinStyle;
typedef CF_ENUM(int32_t, CGLineJoin) {
kCGLineJoinMiter, //斜接
kCGLineJoinRound, //圆接
kCGLineJoinBevel //斜角
};
方法
- 填充
// 利用当前绘画属性填充路径封闭范围, 该方法在绘画之前会自动将开放子路径封闭, 填充部分不包含路径本身, 所以对于线宽较大的路径, 填充部分会跟部分路径重合
- (void)fill;
// 利用指定模式填充路径封闭范围, 该方法在绘画之前会自动将开放子路径封闭, 填充部分不包含路径本身, 所以对于线宽较大的路径, 填充部分会跟部分路径重合
- (void)fillWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;
- 描边
// 利用当前绘画属性沿着路径画线
- (void)stroke;
- 闭合路径
// 路径的闭合
- (void)closePath;
- 裁剪
- (void)addClip;
- 删除点
// 移除所有的点,删除所有的subPath
- (void)removeAllPoints;
- 反方向绘制
// 反方向绘制path
- (UIBezierPath *)bezierPathByReversingPath;
- 指定模式沿着路径画线
// 利用指定模式沿着路径画线
- (void)strokeWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;
设置颜色
- 填充颜色
// 路径的填充颜色
[[UIColor redColor] setFill];
- 描边颜色
// 路径的描边颜色
[[UIColor redColor] setStroke];
注意
UIBezierPath
需要搭配CoreGraphics
来使用,我们一般使用UIBezierPath
都是在重写view
的drawRect
方法这种情形。
网友评论