先看下动画效果:
这里使用粒子动画,加上基础动画组合实现,还有一些绘图的方法,代码注释写的很清楚,看下面代码:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor grayColor];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn.frame = CGRectMake(0, 0, 100, 100);
btn.center = self.view.center;
btn.layer.cornerRadius = 50;
btn.backgroundColor = [UIColor redColor];
[btn addTarget:self action:@selector(good:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
imageView.image = [self circleImageSomeAngle:[UIImage imageNamed:@"zbar.jpg"]];
[self.view addSubview:imageView];
}
- (void)good:(UIButton *)btn
{
CAEmitterLayer *emitterLayer = [CAEmitterLayer layer];
//发射器的尺寸大小
[emitterLayer setEmitterSize:CGSizeMake(CGRectGetWidth(btn.frame), CGRectGetHeight(btn.frame))];
//发射器的中心
emitterLayer.emitterPosition = CGPointMake(btn.bounds.size.width / 2, btn.bounds.size.height / 2);
//从发射器边缘发出
emitterLayer.emitterMode = kCAEmitterLayerOutline;
//发射器形状,圆,粒子在圆形范围发射
emitterLayer.emitterShape = kCAEmitterLayerCircle;
[btn.layer addSublayer:emitterLayer];
CAEmitterCell *emitterCell = [[CAEmitterCell alloc]init];
//设置一个关键字来查找这个对象
[emitterCell setName:@"sunShine"];
//设置内容
emitterCell.contents = (__bridge id _Nullable)([self creatImage].CGImage);
//设置出生率
emitterCell.birthRate = 0;
//设置生命周期
emitterCell.lifetime = 0.4;
//设置变透明的速度
emitterCell.alphaSpeed = -2;
//设置速率
emitterCell.velocity = 200;
//设置速率容差
emitterCell.velocityRange = 200;
//粒子单元数组,用来放发射粒子
emitterLayer.emitterCells = @[emitterCell];
CABasicAnimation *emitterBasic = [CABasicAnimation animationWithKeyPath:@"emitterCells.sunShine.birthRate"];
//通过基础动画设置出生率,从有到无
emitterBasic.fromValue = [NSNumber numberWithFloat:100000];
emitterBasic.toValue = [NSNumber numberWithFloat:0];
//因为存在生命周期,所以持续时间可以不给
emitterBasic.duration = 0;
//设置向外加速
emitterBasic.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[emitterLayer addAnimation:emitterBasic forKey:@"good"];
}
//自己来画一张纯色图片
- (UIImage *)creatImage
{
CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContext(rect.size);
CGContextRef text = UIGraphicsGetCurrentContext();
//设置填充色
CGContextSetFillColorWithColor(text, [UIColor yellowColor].CGColor);
//设置填充区域
CGContextFillRect(text, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return [self circleImage:image];
}
//给图片变圆的高效方法
- (UIImage *)circleImage:(UIImage *)image
{
UIGraphicsBeginImageContext(image.size);
CGContextRef text = UIGraphicsGetCurrentContext();
//设置边线宽
CGContextSetLineWidth(text, 1);
//设置边线条颜色
CGContextSetStrokeColorWithColor(text, [UIColor blackColor].CGColor);
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
//画一个圆
CGContextAddArc(text, image.size.width / 2, image.size.height / 2, image.size.width / 2, 0, M_PI * 2, NO);
//截取圆的部分
CGContextClip(text);
//在圆区域上画图
CGContextDrawImage(text, rect, image.CGImage);
UIImage *circlrImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return circlrImage;
}
//给图片加圆角的高效方法,同时还能设定具体哪个角是圆角
- (UIImage *)circleImageSomeAngle:(UIImage *)image
{
//第二个参数为透明与否,第三个参数设置分辨率和屏幕一样
UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale);
CGContextRef text = UIGraphicsGetCurrentContext();
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(50, 50)];
CGContextAddPath(text, maskPath.CGPath);
CGContextClip(text);
//下面注视的方法和CGContextDrawImage都可以,具体区别有知道的可以发表在评论处
// [image drawInRect:rect];
// CGContextDrawPath(text, kCGPathFillStroke);
CGContextDrawImage(text, rect, image.CGImage);
UIImage *circlrImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return circlrImage;
}
Demo下载地址:https://github.com/codeliu6572/Sunshine