1. UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个OC封装。使用此类可以定义常见的圆形、多边形等形状 。我们使用直线、弧(arc)来创建复杂的曲线形状。每一个直线段或者曲线段的结束的地方是下一个的开始的地方。每一个连接的直线或者曲线段的集合成为subpath。一个UIBezierPath对象定义一个完整的路径包括一个或者多个subpaths。 具体用法看代码仅仅使用UIBezierPath来绘图的话,需要在view的drawRect方法里实现,详细可以看MyView的drawRect方法 // // MyView.m // CAShapeLayerAndUIBezierPath // // Created by 蔡欣东 on 16/4/21. // Copyright © 2016年 蔡欣东. All rights reserved. // #import "MyView.h" @implementation MyView - (void)drawRect:(CGRect)rect { [self simpleDraw]; [self drawARCPath]; [self drawTrianglePath]; [self drawSecondBezierPath]; } //画圆角矩形 -(void)simpleDraw{ UIBezierPath* path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 100, 100) cornerRadius:20]; path.lineWidth = 5; //设置填充颜色 UIColor* fillColor = [UIColor greenColor]; [fillColor set]; [path fill]; //设置线的颜色,需要在填充颜色之后设置 UIColor* lineColor = [UIColor redColor]; [lineColor set]; [path stroke]; } //画圆弧 -(void)drawARCPath{ UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(20, 150) radius:100 startAngle:0 endAngle:M_PI*90/180 clockwise:YES]; //连接处的样式 path.lineCapStyle = kCGLineCapRound; //连接方式 path.lineJoinStyle = kCGLineJoinRound; path.lineWidth = 5; UIColor* lineColor = [UIColor redColor]; [lineColor set]; [path stroke]; } //画三角形 -(void)drawTrianglePath{ UIBezierPath* path = [UIBezierPath bezierPath]; //设置起点 [path moveToPoint:CGPointMake(20, 300)]; [path addLineToPoint:CGPointMake(150, 400)]; [path addLineToPoint:CGPointMake(20, 400)]; [path closePath]; path.lineWidth = 5; UIColor* fillColor = [UIColor greenColor]; [fillColor set]; [path fill]; UIColor* lineColor = [UIColor redColor]; [lineColor set]; [path stroke]; } //画二次贝尔曲线 -(void)drawSecondBezierPath{ UIBezierPath* path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(200, 150)]; [path addQuadCurveToPoint:CGPointMake(200, 300) controlPoint:CGPointMake(50, 50)]; path.lineWidth = 5; UIColor* lineColor = [UIColor redColor]; [lineColor set]; [path stroke]; } @end 用CAShapeLayer和UIBezierPath画图,以及结合CAAnimation实现一个绘图动画 动画效果:
gif1.gif
// // ViewController.m // CAShapeLayerAndUIBezierPath // // Created by 蔡欣东 on 16/4/21. // Copyright © 2016年 蔡欣东. All rights reserved. // #import "ViewController.h" #import "MyView.h" @interface ViewController (){ CAShapeLayer *layer; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //仅仅使用UIBezierPath的话,需要在view的drawRect方法里实现,详细可以看MyView的drawRect方法 // CGFloat W = [UIScreen mainScreen].bounds.size.width; // CGFloat H = [UIScreen mainScreen].bounds.size.height; // MyView* myView = [[MyView alloc]initWithFrame:CGRectMake(0, 0, W, H)]; // myView.backgroundColor = [UIColor whiteColor]; // [self.view addSubview:myView]; //CAShapeLayer和UIBezierPath画图 layer = [CAShapeLayer layer]; layer.fillColor = [UIColor clearColor].CGColor; layer.lineWidth = 20.0f; layer.lineCap = kCALineCapRound; layer.lineJoin = kCALineJoinRound; layer.strokeColor = [UIColor redColor].CGColor; [self.view.layer addSublayer:layer]; // 创建贝塞尔路径 UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:80 startAngle:0 endAngle:M_PI*2 clockwise:NO]; // 关联layer和贝塞尔路径 layer.path = path.CGPath; // 创建Animation CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; animation.fromValue = @(0.0); animation.toValue = @(1.0); layer.autoreverses = NO; animation.duration = 3.0; // 设置layer的animation [layer addAnimation:animation forKey:nil]; animation.delegate = self; int count = 16; for (int i = 0; i<count; i++) { CAShapeLayer* lineLayer = [CAShapeLayer layer]; lineLayer.fillColor = [UIColor clearColor].CGColor; lineLayer.strokeColor = [UIColor yellowColor].CGColor; lineLayer.lineWidth = 15.0f; lineLayer.lineCap = kCALineCapRound; lineLayer.lineJoin = kCALineCapRound; [self.view.layer addSublayer:lineLayer]; UIBezierPath* path2 = [UIBezierPath bezierPath]; int x = 200+100*cos(2*M_PI/count*i); int y = 200-100*sin(2*M_PI/count*i); int len = 50; [path2 moveToPoint:CGPointMake(x, y)]; [path2 addLineToPoint:CGPointMake(x+len*cos(2*M_PI/count*i), y-len*sin(2*M_PI/count*i))]; lineLayer.path = path2.CGPath; [lineLayer addAnimation:animation forKey:nil]; } } //animation结束回调 -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ NSLog(@"yes"); layer.fillColor = [UIColor redColor].CGColor; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end(责任编辑:好模板) |