这些天,一直在研究一些基本动效。其中CAShapeLayer和贝塞尔曲线配合使用,功能很强大,遂,今天总结了一些它们的用法,如下:
贝塞尔曲线与CAShapeLayer的关系
1,CAShapeLayer中shape代表形状的意思,所以需要形状才能生效
2,贝塞尔曲线可以创建基于矢量的路径
3,贝塞尔曲线给CAShapeLayer提供路径,CAShapeLayer在提供的路径中进行渲染。路径会闭环,所以绘制出了Shape
4,用于CAShapeLayer的贝塞尔曲线作为Path,其path是一个首尾相接的闭环的曲线,即使该贝塞尔曲线不是一个闭环的曲线
CAShapeLayer:CAShapeLayer继承自CALayer,注意: 做动效,CAShapeLayer和贝塞尔曲线 更配哦.
- 它依附于一个给定的path,必须给与path,而且,即使path不完整也会自动首尾相接
- strokeStart以及strokeEnd代表着在这个path中所占用的百分比,[0 , 1],0代表Path的开始位置,1代表Path的结束位置
- 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;