CAShapeLayer与UIBezierPath(加动画)
2016-05-07 本文已影响2961人
欣东
前言
1.
UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个OC封装。使用此类可以定义常见的圆形、多边形等形状 。我们使用直线、弧(arc)来创建复杂的曲线形状。每一个直线段或者曲线段的结束的地方是下一个的开始的地方。每一个连接的直线或者曲线段的集合成为subpath。一个UIBezierPath对象定义一个完整的路径包括一个或者多个subpaths。
2.
CAShapeLayer: 继承于CALayer。 每个CAShapeLayer对象都代表着将要被渲染到屏幕上的一个任意的形状(shape)。具体的形状由其path(类型为CGPathRef)属性指定。 普通的CALayer是矩形,所以需要frame属性。CAShapeLayer它本身没有形状,它的形状来源于其属性path 。CAShapeLayer有不同于CALayer的属性,它从CALayer继承而来的属性在绘制时是不起作用的。
具体用法看代码
仅仅使用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