UIBezierPath

一. 初始化方法

+ (instancetype)bezierPath;
+ (instancetype)bezierPathWithRect:(CGRect)rect;
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius; 
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath;

二. 属性和方法介绍

1. 属性

//场合CAKeyFrameAnimation结合使用,  类似于keyFrameAnimation.path = bezierPath.CGPath
@property(nonatomic) CGPathRef CGPath;
- (CGPathRef)CGPath NS_RETURNS_INNER_POINTER CF_RETURNS_NOT_RETAINED;
@property(readonly,getter=isEmpty) BOOL empty;
@property(nonatomic,readonly) CGRect bounds;
//画笔当前的位置
@property(nonatomic,readonly) CGPoint currentPoint;
//线段宽度
@property(nonatomic) CGFloat lineWidth;
//线段尾部样式
@property(nonatomic) CGLineCap lineCapStyle;
//两个线段接头处的样式
@property(nonatomic) CGLineJoin lineJoinStyle;

2. 方法介绍

//将画笔移动到某一点
- (void)moveToPoint:(CGPoint)point;
//天剑一条线到某一点
- (void)addLineToPoint:(CGPoint)point;
//添加控制点
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2;
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;
//添加弧线
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise NS_AVAILABLE_IOS(4_0);
//关闭path
- (void)closePath;
// 移除所有的点,删除所有的subPath
- (void)removeAllPoints;
//为path内填充颜色
- (void)fill;
//绘制路径
- (void)stroke;

三. 实例演示

  1. 简单的初始化, 可以用来初始化直线, 二次曲线, 三次曲线等
+ (instancetype)bezierPath;

用例: 三条直线构成三角形

    UIBezierPath *path1 = [UIBezierPath bezierPath];
    //设置初始位置
    [path1 moveToPoint:CGPointMake(10, 10)];
    //添加线段的三个两个转折点和终点
    [path1 addLineToPoint:CGPointMake(100, 110)];
    [path1 addLineToPoint:CGPointMake(10, 110)];
    [path1 addLineToPoint:CGPointMake(10, 10)];
    //设置线宽
    path1.lineWidth = 3;
    //设置线头和线尾的样式
    path1.lineCapStyle = kCGLineCapRound;
    //设置线的连接处的样式
    path1.lineJoinStyle = kCGLineJoinRound;
    //设置线的颜色
    [[UIColor brownColor] set];
    //设置填充色
    [[UIColor blackColor] setFill];
    [path1 fill];
    //画线
    [path1 stroke];

效果: 灰色的是self.view的背景


11524023105_.pic.jpg
  1. 初始化为一个矩形
+ (instancetype)bezierPathWithRect:(CGRect)rect;

用例: 创建一个宽高为(100, 100)的矩形

    UIBezierPath *path4 = [UIBezierPath bezierPathWithRect:CGRectMake(120, 120, 100, 100)];
    path4.lineWidth = 5;
    path4.lineJoinStyle = kCGLineJoinMiter;
    [[UIColor whiteColor] set];
    [[UIColor brownColor] setFill];
    [path4 fill];
    [path4 stroke];

效果: 灰色的是self.view的背景


41524028595_.pic.jpg
  1. 初始化为一个标准圆形或者椭圆(椭圆只需要设置标准圆的宽高不同即可实现)
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;

用例:

    UIBezierPath * path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 200, 100)];
    [[UIColor redColor] set];
    path.lineWidth = 5.f;
    [path stroke];

效果: 灰色的是self.view的背景


61524030225_.pic.jpg
  1. 初始化一个四个角都是相同的圆角值的矩形
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:
(CGFloat)cornerRadius; 

用例:

    path2.lineWidth = 2;
    [[UIColor blackColor] set];
    [path2 stroke];

效果:


121524036203_.pic.jpg
  1. 初始化某个特定角为圆角的矩形
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;

用例: 左上角和右上角为圆角

    UIBezierPath *path6 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(230, 10, 100, 100) byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(30, 30)];
    [[UIColor whiteColor] set];
    path6.lineWidth = 3;
    [path6 stroke];

效果:


71524032172_.pic.jpg
  1. 初始化一个标准的圆弧线
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;

用例: 创建一个半径为50的圆弧

    CGPoint center = CGPointMake(50, 170);
    UIBezierPath *path3 = [UIBezierPath bezierPathWithArcCenter:center radius:50 startAngle:0 endAngle:M_PI / 2.0 clockwise:YES];
    path3.lineWidth = 3;
    [path3 stroke];

效果:


111524036089_.pic.jpg
  1. 按照CGPathRef初始化一个曲线
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath;
  1. 画一个二次曲线

    101524035711_.pic.jpg

    我们可以看到 起点的切线和终点的切线交于控制点
    //这个view用来在图中显示控制点的位置
    UIView *controlView = [[UIView alloc]initWithFrame:CGRectMake(149, 49, 2, 2)];
    controlView.backgroundColor = [UIColor redColor];
    [self addSubview:controlView];
    //设置Bezier曲线
    UIBezierPath *path8 = [UIBezierPath bezierPath];
    [path8 moveToPoint:CGPointMake(100, 100)];
    [path8 addQuadCurveToPoint:CGPointMake(200, 100) controlPoint:CGPointMake(150, 50)];
    [[UIColor whiteColor] setFill];
    [path8 stroke];
81524034986_.pic.jpg

解析: 起点是(100,100), 终点是(200,100), 控制点是(150,50), 图中的红点就是控制点
建立一个简单的坐标系, 配合一元二次方程可以解出曲线顶点的位置


91524035353_.pic.jpg
  1. 创建一个一元三次曲线
    UIBezierPath *path9 = [UIBezierPath bezierPath];
    [path9 moveToPoint:CGPointMake(20, 280)];
    [path9 addCurveToPoint:CGPointMake(220, 280) controlPoint1:CGPointMake(70, 200) controlPoint2:CGPointMake(170, 360)];
    [[UIColor whiteColor] set];

效果:


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

推荐阅读更多精彩内容

  • UIBezierPath Class Reference 译:UIBezierPath类封装了Core Graph...
    鋼鉄侠阅读 1,721评论 0 3
  • UIBezierPath介绍 基本介绍: UIBezierPath可以用来创建矢量的路径和图形,使用此类可以定义各...
    BigDaddy_阅读 2,545评论 0 7
  • 使用UIBezierPath类可以创建基于矢量的路径,这个类在UIKit中。 此类是Core Graphics框架...
    XLsn0w阅读 1,024评论 0 2
  • UIBezierPath详解 我在写本篇文章之前,也没有系统学习过贝塞尔曲线,只是曾经某一次的需求需要使用到,才临...
    白水灬煮一切阅读 1,172评论 0 4
  • 基础知识 使用UIBezierPath可以创建基于矢量的路径,此类是Core Graphics框架关于路径的封装。...
    zhanming阅读 2,026评论 3 19