iOS-BesizerPath类

前言

贝塞尔曲线是一种矢量曲线 , 主要应用于平面图形的绘制上 .
UIBezierPath ( 这个类在UIKit中 ) 正是运用了这一数学规则 , 此类是Core Graphics框架关于path的一个封装 , 可以进行曲线 , 直线以及他们组合而成的图形的绘制 .

正文

提示 : 因为UIBezierPath的父类是NSObject而不是UIView , 所以他不是可见的控件 , 为了纯粹的学习UIBezierPath , 避免发生混搅 , 我们的操作都在自己创建的view中的- (void)drawRect:(CGRect)rect {}这个方法中操作完成的.

第一步 : 创建StuBeView

学习之前 , 我们需要创建一个UIView , 取名为StuBeView , 如无说明 , 下面的代码都在这里面 .
然后将StuBeView添加到ViewController里面 .

第二步 : 在StuBeView.m中 , 创建UIBezierPath对象

UIBezierPath顾名思义 , path是根本 .
创建和使用一个path对象的过程是分开的 , 包含以下步骤:

- (void)drawRect:(CGRect)rect  
{  
  //1 ) 创建一个Bezier path对象。
  UIBezierPath *beizer = [UIBezierPath bezierPath];
  //2 ) 使用方法moveToPoint:去设置初始线段的起点。
  [beizer moveToPoint:CGPointMake(100, 100)];
  //3 ) 添加line或者curve去定义一个或者多个subpaths。
  [beizer addLineToPoint:CGPointMake(150, 200)];
  [beizer addLineToPoint:CGPointMake(50, 200)];
  [beizer addLineToPoint:CGPointMake(100, 100)];//回到起始点形成封闭的图形
  //4 ) 改变UIBezierPath对象跟绘图相关的属性。
  beizer.lineWidth = 3;//边线的粗细(command点击lineWidth里面有很多属性,不一一列  举)
  UIColor *color = [UIColor grayColor];
  [color set];  //设置线条颜色
  [beizer stroke]; //连线的颜色
  UIColor *color1 = [UIColor redColor];
  [color1 setFill];
  [beizer fill]; //填充的颜色
}

效果图:


效果图1.png
曲线

绘画曲线也是差不多,不过是将line方法变curve方法,直接上代码.

- (void)drawRect:(CGRect)rect  
{  
  UIBezierPath *beizer = [UIBezierPath bezierPath];
  [beizer moveToPoint:CGPointMake(100, 100)];
  [beizer addQuadCurveToPoint:CGPointMake(200,100)controlPoint:CGPointMake(150, 10)];
  [beizer addQuadCurveToPoint:CGPointMake(300, 100) controlPoint:CGPointMake(250, 190)];
  beizer.lineWidth = 3;
  UIColor *color = [UIColor whiteColor];
  [color set];  //设置线条颜色
  [beizer stroke]; //连线的颜色
  UIColor *color1 = [UIColor redColor];
  [color1 setFill];
  //[beizer fill]; //填充的颜色
}

效果图有两张,第一张是注释掉填充的颜色,第二张是有填充颜色,请观察:


![未填充和已填充.png](http://upload-images.jianshu.io/upload_images/1803064-34064d8bdde357a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 发现了吗?(咳咳,图片是截的模拟器的屏,所以第二张图中间看起来像断了,重点不是这个)发现不闭合的曲线填充颜色的时候是以首尾两个端点所连接的直线为闭合线的,所以我们在做需要填充颜色的时候记得绘制完整闭合的图形.

例如:

- (void)drawRect:(CGRect)rect  
{  
  UIBezierPath *beizer = [UIBezierPath bezierPath];
  [beizer moveToPoint:CGPointMake(100, 100)];
  //endPoint:曲线的终点
  //controlPoint:画曲线的基准点,也是控制点
  [beizer addQuadCurveToPoint:CGPointMake(200,100)controlPoint:CGPointMake(150, 10)];
  [beizer addQuadCurveToPoint:CGPointMake(300, 100) controlPoint:CGPointMake(250, 190)];
  beizer.lineWidth = 3;
  [beizer addLineToPoint:CGPointMake(300, 250)];
  [beizer addLineToPoint:CGPointMake(100, 250)];
  [beizer addLineToPoint:CGPointMake(100, 100)];
  UIColor *color = [UIColor whiteColor];
  [color set];  //设置线条颜色
  [beizer stroke]; //连线的颜色
  UIColor *color1 = [UIColor redColor];
  [color1 setFill];
  //[beizer fill]; //填充的颜色
}

可得到效果图:


效果图4.png
圆曲线
在@implementation StubeView上面定义一个宏
DEGREES_TO_RADIANS(degrees)  ((M_PI * degrees)/ 180)  

- (void)drawRect:(CGRect)rect  
{  
  UIColor *color = [UIColor redColor];  
  [color set]; //设置线条颜色  
  /*
   * ArcCenter : 中心点
   * radius : 半径
   * startAngle : :弧线开始的角度值
   * endAngle : :弧线结束的角度值
   * clockwise : 是顺时针(YES)或是逆时针(NO)
   * DEGREES_TO_RADIANS()这个是为了将360°的角度值转换成系统的弧角度
  */
  UIBezierPath* aPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150)  
                                                       radius:75  
                                                   startAngle:0  
                                                     endAngle:DEGREES_TO_RADIANS(135)  
                                                    clockwise:YES];  
  aPath.lineWidth = 5.0;  
  aPath.lineCapStyle = kCGLineCapRound; //线条拐角  
  aPath.lineJoinStyle = kCGLineCapRound; //终点处理  
  [aPath stroke];  
}
圆弧.jpeg
动画连线
- (void)drawRect:(CGRect)rect  
{  
  UIBezierPath *beizer = [UIBezierPath bezierPath];
  [beizer moveToPoint:CGPointMake(100, 100)];
  [beizer addLineToPoint:CGPointMake(150, 200)];
  [beizer addLineToPoint:CGPointMake(50, 200)];
  [beizer addLineToPoint:CGPointMake(100, 100)];//回到起始点形成封闭的图形

  beizer.lineWidth = 3;//边线的粗细(command点击lineWidth里面有很多属性,不一一列举)
  UIColor *color = [UIColor grayColor];
  [color set];  //设置线条颜色
  [beizer stroke]; //连线的颜色

  //*****************添加动画连线******************//
  CAShapeLayer *shapeLayer = [CAShapeLayer layer];
  shapeLayer.path = beizer.CGPath;
  shapeLayer.fillColor = [UIColor clearColor].CGColor;
  shapeLayer.strokeColor = [UIColor redColor].CGColor;
  shapeLayer.lineWidth = 2;
  [self.layer addSublayer:shapeLayer];

  CABasicAnimation *anmi = [CABasicAnimation animation];
  anmi.keyPath = @"strokeEnd";
  anmi.fromValue = [NSNumber numberWithFloat:0];
  anmi.toValue = [NSNumber numberWithFloat:1.0f];
  anmi.duration =2.0f;
  anmi.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  anmi.autoreverses = NO;

  [shapeLayer addAnimation:anmi forKey:@"stroke"];
}

第三步 : 改变view的形状

//左上角和右上角
UIBezierPath *maskPath;  
//byRoundingCorners 选项枚举
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds  
                                 byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)  
                                       cornerRadii:CGSizeMake(10.0f, 10.0f)];  
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];  
maskLayer.frame = self.bounds;  
maskLayer.path = maskPath.CGPath;  
self.layer.mask = maskLayer;  

给UIImageView的image添加圆角的方法(如果是加载网络图片必须等图片加载完成后调用):

- (UIImageView *)imageWithRoundedCornersSize:(float)cornerRadius   
{  
  UIImageView *imageView = self;  
  UIImage * original = self.image;  
  UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);   
  
  [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds  
                            cornerRadius:cornerRadius] addClip];  
  [original drawInRect:imageView.bounds];  
  
  imageView.image = UIGraphicsGetImageFromCurrentImageContext();  
  
  UIGraphicsEndImageContext();  
  
  return imageView;  
} 

如有疑问 , 欢迎交流 !

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

推荐阅读更多精彩内容