美文网首页
UIBezierPath

UIBezierPath

作者: 苏东没有坡 | 来源:发表于2018-07-31 22:06 被阅读0次

UIBezierPath 类:
UIBezierPath是一条由直线和曲线组成的路径,你可以在自己自定义的view中渲染它。
你可以在初始化的时候为你的路径指定一个几何图形,这个路径可以是诸如矩形,椭圆,弧线的简单图形,也可以是由直线曲线混合而成的复杂多边形。定义好图形后,你可以使用UIBezierPath类其他的方法在当前上下文中渲染路径。

一个UIBezierPath对象会结合路径的几何和描述这个路径的属性进行渲染,几何和属性是相互独立的,你可以单独设置他们。在按照你的想法配置了路径后,你可以告诉他在当前上下文绘制自己。因为创建,配置和渲染的过程都是独立的步骤,所以你可以在代码中轻易地复用Bézier对象,你甚至可以使用同一个对象多次渲染同一个图形,你也可以在多次渲染的间隔中,修改渲染的选项得到不同的路径。

你可以通过操纵路径currentPoint的方式绘制几何,当你创建了一个新的空路径对象,currentPoint未定义且必须被明确设置,如果想在不绘制任何线条的情况下移动currentPoint,你可以使用move(to:)方法,其他所有的方法都会导致路径中出现多余的直线或曲线。添加新线条的方法总是假定你从currentPoint开始,在你指定的某个新点结束,添加完线段之后,线段终点自动成为下一个子路径的currentPoint。

一个简单的Bézier对象可以包含任意数量的开放子路径和封闭子路径。每一个子路径都代表着一系列的连接路径段。 调用move(to :)方法结束当前子路径(并不会关闭它)并设置下一个子路径的currentPoint。 Bézier路径的所有子路径都具有同样的绘制属性并被作为一组去操作,如果想用不同的属性绘制子路径,你必须将这些子路径放在它们自己的UIBezierPath对象中。

配置了一个Bézier路径的几何和属性后,你可以使用stroke()和fill() 方法在当前的图形上下文中绘制路径。stroke()方法根据当前的笔触颜色和Bézier路径对象的属性描述路径的轮廓,类似的,fill()方法根据当前的填充色填充路径的闭合区域。
除了绘制图形外,你还可以使用用Bézier路径对象去剪裁区域。调用addClip()方法最终得到的是Bézier路径对象绘制的图形和当前图形上下文剪裁区域相交的区域。在后续绘制期间,只有位于新交叉区域内的内容才会实际呈现给图形上下文。

/**
 * 绘制一个UIBezierPath对象
 */
+ (instancetype)bezierPath;

/**
 * 根据rect画矩形
 * @param rect 矩形frame
 */
+ (instancetype)bezierPathWithRect:(CGRect)rect;

/**
 * 根据rect画椭圆,当rect为正方形时曲线为圆
 * @param rect 矩形frame
 */
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;

/**
 * 根据rect 和圆角半径画圆角矩形 圆角半径为边长一半时为圆
 * @param rect 矩形frame
 * @param cornerRadius 矩形的圆角半径
 */
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius; 

/**
 * 根据rect 和圆角半径画圆角矩形,可指定矩形其中一个或者多个角为圆角
 * @param rect 矩形frame
 * @param corners  指定矩形的哪个角为圆角
 * @param cornerRadii  矩形的圆角半径
 */
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;

/**
 * 根据圆心和角度画圆弧
 * 此方法创建了一个开放路径, 创建出来的圆弧是圆周的一部分. 在默认的坐标系统中绘制时, 起始角度和结束角度都是基于图1所示单位圆 . 调用这个方法之后, currentPoint 将会设置为圆弧的结束点.
 * 例如: 
 * 我们指定起始角度为0, 指定结束角度为π, 设置 clockwise 属性为 YES, 绘制出的圆弧是圆的下半圆周。
 * 我们不修改起始角度和结束角度, 仅仅将 clockwise 属性设置为 NO, 则绘制出来圆弧是圆的上半圆周。
 * @param center:   圆心
 * @param radius:   半径
 * @param startAngle:   起始角度
 * @param endAngle:    结束角度
 * @param clockwise:   是否顺时针绘制
  */

+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;

 
/**
 * 绘制一个使用Core Graphics路径的内容初始化的新UIBezierPath对象。
 */
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath;

/**
 * 绘制一个当前路径相反的新的贝塞尔路径对象
 */

- (UIBezierPath *)bezierPathByReversingPath NS_AVAILABLE_IOS(6_0);

图1.jpg
/**
 * 设置当前点
 */
- (void)moveToPoint:(CGPoint)point;

/**
 * 绘制当前点到指定点(参数point)的直线
 */
- (void)addLineToPoint:(CGPoint)point;

/**
 * 绘制三次贝塞尔曲线
 * 如图2所示,此方法会绘制从currentPoint到endPoint的三次贝塞尔曲线。controlPoint1和controlPoint2 定义了弧线的曲率。
 *如果没有currentPoint,用moveToPoint方法设置currentPoint
 */
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2;

/**
 * 绘制二次贝塞尔曲线
 * 此方法会绘制从currentPoint到endPoint的二次贝塞尔曲线。controlPoint1为控制点
 */
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;

/**
 * 绘制弧线
 * 可参照 bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise
 */
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise NS_AVAILABLE_IOS(4_0);

图2.jpeg
/**
 * 关闭路径
 */
- (void)closePath;

/**
 * 移除所有的点
 */
- (void)removeAllPoints;

/**
 * 添加路径
 */
- (void)appendPath:(UIBezierPath *)bezierPath;


/**
 * 使用指定仿射变换模型变换所有的点
 */

- (void)applyTransform:(CGAffineTransform)transform;

/**
 * 设置线型
 */
- (void)setLineDash:(nullable const CGFloat *)pattern count:(NSInteger)count phase:(CGFloat)phase;

/**
 * 检索线型
 */
- (void)getLineDash:(nullable CGFloat *)pattern count:(nullable NSInteger *)count phase:(nullable CGFloat *)phase;

/**
 * 填充颜色
 */
- (void)fill;

/**
 * 根据指定的混合属性和透明度填充颜色
 */
- (void)fillWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;

/**
 * 根据当前绘制属性绘制路径
 */
- (void)stroke;

/**
 * 根据指定的混合属性和透明度绘制路径
 */
- (void)strokeWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;

/**
 * 裁剪
 */
- (void)addClip;

相关文章

网友评论

      本文标题:UIBezierPath

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