iOS UIBezierPath方法的使用

创建UIBezierPath对象


/** 
 *  创建并返回一个UIBezierPath对象。 
 * 
 *  @return 一个新的空路径对象。 
 */  
+ (instancetype)bezierPath;  
/** 
 *  创建并返回一个用矩形路径初始化的UIBezierPath对象。 
 * 
 *  @param rect 矩形路径 
 * 
 *  @return 与矩形路径的新路径对象 
 */  
+ (instancetype)bezierPathWithRect:(CGRect)rect;  
下面是对应代码和效果图
屏幕快照 2017-08-16 下午4.25.54.png
屏幕快照 2017-08-16 下午4.14.41.png
/** 
 *  创建并返回一个在指定的矩形内切一个椭圆形的路径初始化的UIBezierPath对象 
 * 
 *  @param rect 矩形,会内切一个椭圆 
 * 
 *  @return 与椭圆形路径一致的新路径对象。 
 */  
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;  
下面是对应代码和效果图
屏幕快照 2017-08-16 下午4.24.45.png
屏幕快照 2017-08-16 下午4.19.04.png
/** 
 *  创建并返回一个采用了圆角矩形路径初始化的UIBezierPath对象。 
 * 
 *  @param rect         矩形路径 
 *  @param cornerRadius 圆角半径 
 * 
 *  @return 与圆角矩形路径一致的对象。 
 */  
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;  
屏幕快照 2017-08-16 下午4.33.20.png

屏幕快照 2017-08-16 下午4.33.12.png
/** 
 *  创建并返回一个采用了圆角矩形路径初始化的UIBezierPath采用了圆角矩形路径初始化的对象。(圆角位置可选) 
 * 
 *  @param rect        矩形路径 
 *  @param corners     圆角的角标(顺时针方向), 取值参考下面的UIRectCorner 
 *  @param cornerRadii 圆角半径 
 * 
 *  @return 与圆角矩形路径一致的对象。 
 */  
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;  
/** 
 *  enum UIRectCorner { 
 *  UIRectCornerTopLeft      =  1  <<  0 , // 矩形左上角 
 *  UIRectCornerTopRight     =  1  <<  1 , // 矩形的右上角 
 *  UIRectCornerBottomLeft   =  1  <<  2 , // 矩形的左下角 
 *  UIRectCornerBottomRight  =  1  <<  3 , // 矩形的右下角 
 *  UIRectCornerAllCorners   =  ~ 0 // 矩形的各个角 
 *  }; 
 */  
屏幕快照 2017-08-16 下午4.35.58.png

屏幕快照 2017-08-16 下午4.35.51.png
/** 
 *  创建并返回一个带有圆弧初始化的UIBezierPath对象。 
 * 
 *  @param center     指定圆的中心点(在当前坐标中)用于定义弧 
 *  @param radius     指定用于定义圆弧的圆的半径 
 *  @param startAngle 指定弧的起始角(以弧度测量) 
 *  @param endAngle   指定圆弧的结束角(以弧度测量) 
 *  @param clockwise  绘制圆弧的方向 (YES表示顺时针) 
 * 
 *  @return 与指定弧路径一致的对象 
 */  
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;  
屏幕快照 2017-08-16 下午4.40.17.png

屏幕快照 2017-08-16 下午4.39.43.png

创建一个带箭头和圆角的贝塞尔

CGFloat width = 400;
    CGFloat height = 300;
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 100, width, height)];
    [self.view addSubview:view];

    CAShapeLayer *shapeLayer = [CAShapeLayer new];
    shapeLayer.fillColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5].CGColor;
    [view.layer addSublayer:shapeLayer];

    UIBezierPath* path = [UIBezierPath bezierPath];
    path.lineWidth = 5.0;

    path.lineCapStyle = kCGLineCapRound; //线条拐角
    path.lineJoinStyle = kCGLineJoinRound; //终点处理

    [path moveToPoint:CGPointMake(0, 10)];//起点
    [path addArcWithCenter:CGPointMake(10, 10) radius:10 startAngle:M_PI endAngle:1.5*M_PI clockwise:YES];
    // Draw the lines
    [path addLineToPoint:CGPointMake(width-10, 0.0)];
    [path addArcWithCenter:CGPointMake(width-10, 10) radius:10 startAngle:1.5*M_PI endAngle:0 clockwise:YES];
    [path addLineToPoint:CGPointMake(width, height - 30 -10)];
    [path addArcWithCenter:CGPointMake(width-10, height - 30 -10) radius:10 startAngle:0 endAngle:M_PI_2 clockwise:YES];
    [path addLineToPoint:CGPointMake(width/2.f - 30, height - 30)];
    [path addLineToPoint:CGPointMake(width/2.f, height)];
    [path addLineToPoint:CGPointMake(width/2.f + 30, height - 30)];
    [path addLineToPoint:CGPointMake(10, height - 30)];
    [path addArcWithCenter:CGPointMake(10, height - 30 -10) radius:10 startAngle:M_PI_2 endAngle:M_PI clockwise:YES];
    [path closePath];//第五条线通过调用closePath方法得到的

    [path fill];
    shapeLayer.path = path.CGPath;
IMG_DCBFB1BD80D0-1.jpeg
/** 
 *  创建并返回一个指定路径信息的UIBezierPath对象 
 * 
 *  @param CGPath 路径 
 * 
 *  @return 与指定路径一致的对象 
 */  
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath;  
/** 
 *  创建并返回一个相反方向具有相同路径形状的对象 
 * 
 *  @return 在相反方向具有相同路径的形状的新路径的对象 
 */  
- (UIBezierPath *)bezierPathByReversingPath;  

构建路径

/** 
 *  第一个点的位置 
 * 
 *  @param point 起始点的坐标 
 */  
- (void)moveToPoint:(CGPoint)point;  
/** 
 *  添加直线的路径 
 * 
 *  @param point 线段的终点坐标 
 */  
- (void)addLineToPoint:(CGPoint)point;  
/** 
 *  添加圆弧路径 
 * 
 *  @param center     圆弧的圆点坐标 
 *  @param radius     圆弧半径 
 *  @param startAngle 圆弧起始角 
 *  @param endAngle   圆弧结束角 
 *  @param clockwise  绘制方向(YES顺时针) 
 */  
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;  
/** 
 *  添加一个三次贝塞尔曲线路径 
 * 
 *  @param endPoint      曲线的终点坐标 
 *  @param controlPoint1 第一个控制点 
 *  @param controlPoint2 第二个控制点 
 */  
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2;  
/** 
 *  添加一个二次贝塞尔曲线路径 
 * 
 *  @param endPoint     曲线的终点坐标 
 *  @param controlPoint 控制点坐标 
 */  
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;  
/** 
 *  关闭路径 
 */  
- (void)closePath;  
/** 
 *  移除所有的子路径 
 */  
- (void)removeAllPoints;  
/** 
 *  将bezierPath和当前对象添加到一起??? 
 * 
 *  @param bezierPath 待添加的路径 
 */  
- (void)appendPath:(UIBezierPath *)bezierPath;  
/** 
 *  设置路径线路的图案 
 * 
 *  @param pattern 线段和间隙的长度??? 
 *  @param count   图案的值??? 
 *  @param phase   在该偏移开始绘制图案,在沿虚线图案点测量??? 
 */  
- (void)setLineDash:(const CGFloat *)pattern count:(NSInteger)count phase:(CGFloat)phase;  
/** 
 *  获取路径线路的图案 
 * 
 *  @param pattern   线段和间隙的长度??? 
 *  @param count   图案的值??? 
 *  @param phase   在该偏移开始绘制图案,在沿虚线图案点测量??? 
 */  
- (void)getLineDash:(CGFloat *)pattern count:(NSInteger *)count phase:(CGFloat *)phase;  
/** 
 *  填充当前路径包围的区域 
 */  
- (void)fill;  
/** 
 *  用指定的混合模式和透明度来填充路径包围的区域 
 * 
 *  @param blendMode 混合模式,枚举值 
 *  @param alpha     透明度 
 */  
- (void)fillWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;  
/** 
 *  按路径画线 
 */  
- (void)stroke;  
/** 
 *  按指定的混合模式和透明度进行画线 
 * 
 *  @param blendMode 混合模式,枚举值 
 *  @param alpha     透明度 
 */  
- (void)strokeWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;  
/** 
 *  此方法会修改当前图形上下文的可见绘图区域。调用它之后,后续绘制操作导致呈现的内容,只有当他们出现指定路径的填充区域内。 
 *  如果您需要删除裁剪区域执行后续的绘制操作,必须保存当前图形状态(使用CGContextSaveGState调用此方法之前功能)。当你不再需要剪切区域,则可以恢复以前的绘图性能和使用剪切区域CGContextRestoreGState功能 
 */  
- (void)addClip;  
/** 
 *  路径包围的面积是否包含指定点 
 * 
 *  @param point 用来测试路径的点 
 * 
 *  @return YES:该点在路径包围的面积内,NO:则不在 
 */  
- (BOOL)containsPoint:(CGPoint)point;  

/** 
 *  使用仿射变换矩阵的路径转换的路径 
 * 
 *  @param transform 仿射变换矩阵应用到的路径 
 */  
- (void)applyTransform:(CGAffineTransform)transform;  

相关属性

@property (nonatomic) CGPathRef CGPath;  



@property (nonatomic,readonly) CGPoint currentPoint;// 在图形路径中的当前点,如果当前路径为空,则此属性为CGPointZero  



@property (nonatomic) CGFloat lineWidth; // 路径的线宽,默认1.0;  



@property (nonatomic) CGLineCap lineCapStyle; // 端点样式,默认kCGLineCapButt  
/** 
 *  enum CGLineCap { 
 *      kCGLineCapButt, 
 *      kCGLineCapRound, 
 *      kCGLineCapSquare 
 *  }; 
 */  



@property (nonatomic) CGLineJoin lineJoinStyle; // 线条链接样式,默认kCGLineJoinMiter  
/** 
 *  enum CGLineJoin { 
 *      kCGLineJoinMiter, //尖的,斜接 
 *      kCGLineJoinRound, //圆 
 *      kCGLineJoinBevel //斜面 
 *  } 
 */  



@property (nonatomic) CGFloat miterLimit; // 尖角限制值  



@property (nonatomic) CGFloat flatness; // 曲线平坦度,默认0.6;值越小,曲线越平滑,但需要更多的计算时间。值越大,会导致更多的锯齿状曲线,但呈现的速度要快得多。  



@property (nonatomic) BOOL usesEvenOddFillRule; // 是否使用奇偶缠绕规则填补路径,默认是NO; YES,路径是使用奇偶规则填补。NO,它使用的是非零规则填补。  
/** 
 *  对于奇偶规则,如果路径交叉的总数为奇数,则点被认为是在路径内与相应的区域被填充。如果横跨的数目是偶数,则点被认为是所述路径之外和该区域不填充。 
 *  为非零规则,左到右路径的交叉计数为+1和右至左路径的交叉计数为-1。如果该交叉的总和不为零,该点被认为是在路径内与相应的区域被填充。如果该和为0,则点是路径外面和该区域不填充。 
 */  



@property (readonly,getter=isEmpty) BOOL empty;//路径是否有任何有效的元素(只读);有效的路径元素包括命令来移动到指定的点,画一条直线或曲线段或闭合路径  



@property (nonatomic,readonly) CGRect bounds; // 路径的边框(只读);此属性的值表示完全封闭路径中的所有点,包括贝塞尔和二次曲线的控制点的最小矩形。 

参考链接:https://www.cnblogs.com/jaesun/p/iOS-CAShapeLayerUIBezierPath-hua-xian.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,138评论 25 707
  • Text Kit学习(入门和进阶): http://www.cocoachina.com/industry/201...
    F麦子阅读 4,039评论 1 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 今天我读了鲁迅先生的《药》。下面我为大家摘抄一段: 老栓也向那边看,却只见一堆人的后背;颈项都伸得很长,仿佛许多鸭...
    YolandaYanyoyo阅读 353评论 0 0
  • 写下这个题目眼泪就开始在眼睛里面打转,从小到大没有亲口叫过哥哥,从小到大都是我在欺负他,可是从小到大都是他在...
    D061张琴阅读 191评论 0 0