UIBezierPath详解

2020-11-14  本文已影响0人  我不白先生

Bezier Path 基础

UIBezierPath对象是CGPathRef数据类型的封装。path如果是基于矢量形状的,都用直线和曲线段去创建。我们使用直线段去创建矩形和多边形,使用曲线段去创建弧(arc),圆或者其他复杂的曲线形状。每一段都包括一个或者多个点,绘图命令定义如何去诠释这些点。每一个直线段或者曲线段的结束的地方是下一个的开始的地方。每一个连接的直线或者曲线段的集合成为subpath。一个UIBezierPath对象定义一个完整的路径包括一个或者多个subpaths。

UIBezierPath类头文件定义

// 根据一个Rect画一个矩形曲线

/**

*/

/**

*/

/**

*/

typedef NS_OPTIONS(NSUInteger, UIRectCorner) {

UIRectCornerTopLeft     = 1 << 0,

UIRectCornerTopRight    = 1 << 1,

UIRectCornerBottomLeft  = 1 << 2,

UIRectCornerBottomRight = 1 << 3,

UIRectCornerAllCorners  = ~0UL

};

/**

*/

/**

*/

image

图片来自网络

/**

*/

@property(nonatomic)CGPathRef CGPath;

/**

*/

/**

*/

/**

*/

image

图片来自网络

/**

*/

image

图片来自网络

/**

*/

/**

*/

/**

*/

// Appending paths

// 添加一个paths UIBezierPath

// Modified paths

// 创建并返回一个与当前路径相反的新的贝塞尔路径对象

// Transforming paths

// 用指定的仿射变换矩阵变换路径的所有点

// Path info

// 该值指示路径是否有任何有效的元素。

@property(readonly,getter=isEmpty)BOOL empty;

// 路径包括的矩形

@property(nonatomic,readonly)CGRect bounds;

// 图形路径中的当前点

@property(nonatomic,readonly)CGPoint currentPoint;

// 接收器是否包含指定的点

// Drawing properties

// 线宽

@property(nonatomic)CGFloat lineWidth;

typedef CF_ENUM(int32_t, CGLineCap) {

kCGLineCapButt,  默认的

kCGLineCapRound, 轻微圆角

kCGLineCapSquare 正方形

};

// 端点类型

@property(nonatomic)CGLineCap lineCapStyle;

typedef CF_ENUM(int32_t, CGLineJoin) {

kCGLineJoinMiter, 默认的表示斜接

kCGLineJoinRound, 圆滑衔接

kCGLineJoinBevel  斜角连接

};

// 连接类型

@property(nonatomic)CGLineJoin lineJoinStyle;

// 最大斜接长度 斜接长度指的是在两条线交汇处内角和外角之间的距离

@property(nonatomic)CGFloat miterLimit;// Used when lineJoinStyle is kCGLineJoinMiter

image

/*

最大斜接长度 斜接长度指的是在两条线交汇处内角和外角之间的距离

只有lineJoin属性为kCALineJoinMiter时miterLimit才有效

边角的角度越小,斜接长度就会越大。

为了避免斜接长度过长,我们可以使用 miterLimit属性。

如果斜接长度超过 miterLimit的值,边角会以 lineJoin的 "bevel"即kCALineJoinBevel类型来显示

*/

image

// 确定弯曲路径短的绘制精度的因素

@property(nonatomic)CGFloat flatness;

// 一个bool值指定even-odd规则是否在path可用

@property(nonatomic)BOOL usesEvenOddFillRule;// Default is NO. When YES, the even-odd fill rule is used for drawing, clipping, and hit testing.

// 设置线型 可设置成虚线

CGFloat pattern[] = {1,1};

// 检索线型

// Path operations on the current graphics context 当前图形上下文中的路径操作:

// 填充颜色

// 利用当前绘图属性沿着接收器的路径绘制

// These methods do not affect the blend mode or alpha of the current graphics context

// 用指定的混合模式和透明度值来描绘受接收路径所包围的区域

// 使用指定的混合模式和透明度值沿着接收器路径。绘制一行

// 剪切被接收者路径包围的区域该路径是带有剪切路径的当前绘图上下文。使得其成为我们当前的剪切路径

实践~敲出如下图代码

image

// [triangle stroke];

[triangle closePath];

// 二次贝塞尔曲线

UIBezierPath *quadBe = [UIBezierPathbezierPath];

[quadBe moveToPoint:CGPointMake(30,150)];

[quadBe addQuadCurveToPoint:CGPointMake(130,150) controlPoint:CGPointMake(30,70)];

UIBezierPath *quadBe2 = [UIBezierPathbezierPath];

[quadBe2 moveToPoint:CGPointMake(160,150)];

[quadBe2 addQuadCurveToPoint:CGPointMake(260,150) controlPoint:CGPointMake(210,50)];

[quadBe2 appendPath:quadBe];

quadBe2.lineWidth = 1.5f;

quadBe2.lineCapStyle = kCGLineCapSquare;

quadBe2.lineJoinStyle = kCGLineJoinRound;

[brushColor set];

[quadBe2 stroke];

// 三次贝塞尔曲线

UIBezierPath *threePath = [UIBezierPathbezierPath];

[threePath moveToPoint:CGPointMake(30,250)];

[threePath addCurveToPoint:CGPointMake(260,230) controlPoint1:CGPointMake(120,180) controlPoint2:CGPointMake(150,260)];

threePath.lineWidth = 1.5f;

threePath.lineCapStyle = kCGLineCapSquare;

threePath.lineJoinStyle = kCGLineJoinRound;

[brushColor set];

[threePath stroke];

}

}

上一篇下一篇

猜你喜欢

热点阅读