美文网首页
UIBezierPath

UIBezierPath

作者: Carson_Zhu | 来源:发表于2018-02-06 23:47 被阅读29次

简介

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都是在重写viewdrawRect方法这种情形。

相关文章

网友评论

      本文标题:UIBezierPath

      本文链接:https://www.haomeiwen.com/subject/cdwnzxtx.html