UIKit中我们使用的UIView、UILabel等控件其实显示的载体都是CALayer及其子类,比如CATextLayer、CAScrollLayer等。我们在做Layer层动画的时候则使用的CAShapeLayer比较多。通过CoreAnimal中的CABasicAnimation结合path来实现。
之前都是通过长篇幅的介绍一些理论知识,这次通过一个个的小案例,由简到繁一步步介绍。
画正方形、圆形、半圆形等
1 | // UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(50, 50, 100, 100)]; |
strokeStart和strokeEnd属性案例
1 | UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 200) radius:80 startAngle:-M_PI_2 endAngle:M_PI*3/2 clockwise:YES]; |
strokeStart和strokeEnd就是笔的开始和结束,值的范围是0到1。
渐变层的使用
1 | CAGradientLayer *layer = [CAGradientLayer layer]; |
- frame 渐变层是不支持路径的,是通过frame属性来设置大小的,只有长方形和正方形。
- colors 设置需要渐变的颜色
- startPoint 设置渐变的开始位置,x、y值的范围是0到1
- endPoint 设置渐变结束的位置,x、y值的范围是0到1
假设我们想通过路径渐变应该怎么办呢?比如一个半圆弧的渐变(可以思考一下怎么实现,下边会有实现的)
遮罩层
以下代码是首先画了一个正方形,填充颜色是红色,然后画了一个圆形。圆形是正方形的遮罩层
如果大家了解ps的话,其实遮罩层就是ps中的蒙版的概念。
遮罩层不会显示出来,遮罩层有颜色的区域才会将被遮罩层显示出来,没有颜色的不会显示出来1
2
3
4
5
6
7
8
9
10
11
12UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) cornerRadius:50];//圆形
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = CGRectMake(0, 0, 100, 100);
maskLayer.path = maskPath.CGPath;
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];//正方形
CAShapeLayer *layer = [CAShapeLayer layer];
layer.frame = CGRectMake(50, 50, 100, 100);
layer.path = path.CGPath;
layer.fillColor = [UIColor redColor].CGColor;
layer.mask = maskLayer;//设置遮罩层
[self.view.layer addSublayer:layer];
上边的问题不知道大家有没有思路了呢?
fillRule中kCAFillRuleEvenOdd属性
1 | UIBezierPath *path1 = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];//正方形 |
不知道大家看效果图有没有明白这个属性的作用呢?其实就是对于两个path有重叠部分,取其非交集。比如一个矩形中有一个圆,则填充颜色的区域是这两个的非交集部分。比如我们画两个同心圆,一大一小,则能够实现画出一个扇形。
综合以上属性,比较复杂的效果
1 | UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:80 startAngle:-M_PI_2 endAngle:M_PI/2 clockwise:YES];//以point为中心,radius的值为半径画弧。此弧的开始角度为startAngle,结束角度为endAngle,这两个数值是弧度,不是角度。clockwise是画此弧是按照顺时针还是逆时针 |
关键帧动画
CAKeyframeAnimation在这里是实现了一个小圆球沿着一个半圆路径一直旋转运动的动画。(圆心在路径上)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23UIBezierPath *circle = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 10, 10) cornerRadius:5];
CAShapeLayer *circleLayer = [CAShapeLayer layer];
circleLayer.frame = CGRectMake(0, 0, 10, 10);
circleLayer.fillColor = [UIColor orangeColor].CGColor;
circleLayer.path = circle.CGPath;
[self.view.layer addSublayer:circleLayer];
CAKeyframeAnimation * theAnimation;
// Create the animation object, specifying the position property as the key path.
theAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
theAnimation.path=thePath;
theAnimation.duration=5.0;
theAnimation.repeatCount = 100;
theAnimation.fillMode = kCAFillModeForwards;
[circleLayer addAnimation:theAnimation forKey:@"position"];
CAShapeLayer *animalTrack = [CAShapeLayer layer];
animalTrack.path = thePath;
animalTrack.strokeColor = [UIColor redColor].CGColor;
animalTrack.fillColor = [UIColor clearColor].CGColor;
animalTrack.lineWidth = 1;
[self.view.layer addSublayer:animalTrack];
这里一开始有个问题,就是不是圆心沿着路径运动。然后我又换成了UIView试了一下可以的。最后研究主要是circleLayer我们仅仅设置了path,但是frame是没有的,设置了frame之后圆心开始沿着路径运动。