贝塞尔曲线与CAShapeLayer

来源:互联网 发布:淘宝支持微信付款吗 编辑:程序博客网 时间:2024/05/31 18:52

这些天,一直在研究一些基本动效。其中CAShapeLayer和贝塞尔曲线配合使用,功能很强大,遂,今天总结了一些它们的用法,如下:

贝塞尔曲线与CAShapeLayer的关系 

1,CAShapeLayer中shape代表形状的意思,所以需要形状才能生效 

2,贝塞尔曲线可以创建基于矢量的路径 

3,贝塞尔曲线给CAShapeLayer提供路径,CAShapeLayer在提供的路径中进行渲染。路径会闭环,所以绘制出了Shape 

4,用于CAShapeLayer的贝塞尔曲线作为Path,其path是一个首尾相接的闭环的曲线,即使该贝塞尔曲线不是一个闭环的曲线


CAShapeLayer:CAShapeLayer继承自CALayer,注意: 做动效,CAShapeLayer和贝塞尔曲线 更配哦.

  1. 它依附于一个给定的path,必须给与path,而且,即使path不完整也会自动首尾相接
  2. strokeStart以及strokeEnd代表着在这个path中所占用的百分比,[0 , 1],0代表Path的开始位置,1代表Path的结束位置
  3. CAShapeLayer动画仅仅限于沿着边缘的动画效果,它实现不了填充效果 4.CAShapeLayer属于CoreAnimation框架,通过GPU来渲染图形,节省性能。动画渲染直接提交给手机GPU,不消耗内存,DrawRect属于CoreGraphic框架,占用CPU,消耗性能大


贝塞尔曲线: 

//根据一个矩形画曲线

(UIBezierPath *)bezierPathWithRect:(CGRect)rect


//根据矩形框的内切圆画曲线

(UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect


//根据矩形画带圆角的曲线

(UIBezierPath *)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius

//在矩形中,可以针对四角中的某个角加圆角 参数: corners:枚举值,可以选择某个角 cornerRadii:圆角的大小

(UIBezierPath *)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii


//以某个中心点画弧线    参数: center:弧线中心点的坐标 radius:弧线所在圆的半径 startAngle:弧线开始的角度值 endAngle:弧线结束的角度值 clockwise:是否顺时针画弧线

(UIBezierPath *)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;


//画二元曲线,一般和moveToPoint配合使用 参数: endPoint:曲线的终点 controlPoint:画曲线的基准点

  • (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint


//以三个点画一段曲线,一般和moveToPoint配合使用 参数: endPoint:曲线的终点 controlPoint1:画曲线的第一个基准点 controlPoint2:画曲线的第二个基准点

  • (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2


// 贝塞尔曲线(创建一个圆) 

UIBezierPath bezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100 / 2.f, 100 / 2.f) radius:100 / 2.f startAngle:0 endAngle:M_PI 2 clockwise:YES];

// 创建一个shapeLayer 

CAShapeLayer *layer = [CAShapeLayer layer]; 

layer.frame = showView.bounds; // 与showView的frame一致 

layer.strokeColor = [UIColor greenColor].CGColor; // 边缘线的颜色 

layer.fillColor = [UIColor clearColor].CGColor; // 闭环填充的颜色 

layer.lineCap = kCALineCapSquare; // 边缘线的类型 

layer.path = bezierPath.CGPath; // 从贝塞尔曲线获取到形状 

layer.lineWidth = 4.0f; // 线条宽度 

layer.strokeStart = 0.0f; layer.strokeEnd = 0.1f;

0 0
原创粉丝点击