iOS layer
//捏合手势方法。
-(void)pinchAction:(id)sender{
NSLog(@"捏合");
UIPinchGestureRecognizer *pin=(UIPinchGestureRecognizer *)sender;
// self.myImageV.transform=CGAffineTransformMakeScale(pin.scale, pin.scale);
pin.view.transform = CGAffineTransformScale(pin.view.transform, pin.scale, pin.scale);
pin.scale = 1;
float tempF = self.myImageV.size.height/self.myImageV.size.width;
if (self.myImageV.size.width<150) {
self.myImageV.size = CGSizeMake(150, 150*tempF);
}
}
#if 0
//1iOS-对CALayer的最简单使用
iOS的Core Animation,有很多概念,包括Layer(层)、Animation(动画)和Timing(时序)、Layout(布局)和constraint(约束)、Transaction(处理)。其中Layer是最基础的。
Layer有多种,最基本的是CALayer,它也是其他种类Layer的父类。CALayer的子类有:
CAScrollLayer,用于简化显示层的一部分
CATextLayer,便于从字符串生成内容是文本的层
CATiledLayer,可用于显示复杂的图片
CAOpenGLLayer,提供OpenGLES渲染环境
Core Animation是基于QuartzCore的,需要在项目中引入框架
编写iOS视图UIView的动画效果需要很多代码,虽然iOS 4支持块定义,对视图动画的定义减少了不少代码,但语法依旧不好看。CPAnimationSequence是一个开源代码库,可以一种间接快捷的方式来定义描述动画队列,克服了写繁多的代码。下面一个使用例子:
查看源码打印?
01
CPAnimationSequence* shakespeare = [CPAnimationSequence sequenceWithSteps:
02
[CPAnimationStep for:0.2 animate:^{ self.romeo.alpha = 1.0; }],
03
[CPAnimationStep for:0.2 animate:^{ self.julia.alpha = 1.0; }],
04
[CPAnimationStep after:1.0 for:0.7 animate:^{
05
CGPoint love = CGPointMake((self.romeo.center.x + self.julia.center.x)/2,
06
(self.romeo.center.y + self.julia.center.y)/2);
07
self.romeo.center = love;
08
self.julia.center = love;
09
}],
10
[CPAnimationStep after:2.0 for:0.5 animate:^{ self.romeo.alpha = 0.0;
11
self.julia.alpha = 0.0; }]
12
nil];
13
[shakespeare run];
官方网站:http://www.open-open.com/lib/view/home/1326072094546
-(void)loadSimpleImageAnimation{
//创建图片对象
UIImage *image = [UIImage imageNamed:@"6.png"];
//创建层
CALayer *layer = [CALayer layer];
layer.backgroundColor = [[UIColor blackColor] CGColor];//设置背景色
layer.bounds = CGRectMake(0, 0, image.size.width,image.size.height);//层设置为图片大小
layer.contents = (id)[image CGImage];//层的内容设置为图片
layer.position = CGPointMake(1024/2 , 768/2);//层在view的位置
[self.view.layer addSublayer:layer];//将层加到当前View的默认layer下
[layer release];
[image release];
}
第二种方式相对复杂一些,但如果更好的进行控制,还是使用这种方法吧,
基本使用方法可以看一下如下例子:
CATransition *animation = [CATransition animation];
[animation setDuration:1.25f];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[animation setType:kCATransitionReveal];
[animation setSubtype: kCATransitionFromBottom];
[self.view.layer addAnimation:animation forKey:@"Reveal"];
这里使用了setType与setSubtype组合,这使用个比较保险,因为他的参数就是官方API里定义的,他们的参数说明可以参考如下:
[animation setType:@"suckEffect"];
这里的suckEffect就是效果名称,可以用的效果主要有:
rippleEffect 滴水效果
suckEffect 收缩效果,如一块布被抽走
cube 立方体效果
oglFlip 上下翻转效果
最后再给出一种常用代码供大家参考。
CATransition *animation = [CATransition animation];
[animation setDuration:0.35];
[animation setTimingFunction:UIViewAnimationCurveEaseInOut];
if (!curled)
{
//animation.type = @"mapCurl";
animation.type = @"pageCurl";
animation.fillMode = kCAFillModeForwards;
animation.endProgress = 0.99;
} else {
//animation.type = @"mapUnCurl";
animation.type = @"pageUnCurl";
animation.fillMode = kCAFillModeBackwards; animation.startProgress = 0.01;
}
[animation setRemovedOnCompletion:NO];
[view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
[view addAnimation:animation forKey"pageCurlAnimation"];
// Disable user interaction where necessary
if (!curled) {
}
else {
}
curled = !curled;
一.基本方式:使用UIView类的UIViewAnimation扩展
函数说明
+ (void)beginAnimations:(NSString *)animationID context:(void *)context; // 开始准备动画
+ (void)commitAnimations; // 运行动画
// 没有get方法,下面的set在快外调用无效
+ (void)setAnimationDelegate:(id)delegate; // 委托default = nil
+ (void)setAnimationWillStartSelector:(SEL)selector; // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context
+ (void)setAnimationDidStopSelector:(SEL)selector; // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
+ (void)setAnimationDuration:(NSTimeInterval)duration; // default = 0.2动画时间
+ (void)setAnimationDelay:(NSTimeInterval)delay; // default = 0.0延迟多少时间开始执行动画
+ (void)setAnimationStartDate:(NSDate *)startDate; // default = now ([NSDate date])动画开始日期?不知道啥用.- -
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; // default = UIViewAnimationCurveEaseInOut动画方式
+ (void)setAnimationRepeatCount:(float)repeatCount; // default = 0.0. May be fractional重复次数
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; // default = NO. YES的话,动画(非最后一次)结束后动态复原到最开始状态
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; // default = NO. YES,停止之前的动画,从现在这里开始新动画the current view position is always used for new animations -- allowing animations to "pile up" on each other. Otherwise, the last end state is used for the animation (the default).
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache; // 添加动画到view上,cache是YES的时候比较高效,但是动画过程中不能更新界面上的内容,NO时每一帧都重新画,可以实时更新
+ (void)setAnimationsEnabled:(BOOL)enabled; // 是否忽略一些动画设置
+ (BOOL)areAnimationsEnabled;
一个动画的代码
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:2.7];
[UIView setAnimationTransition:transition forView:self.view cache:YES];
// operation>>>
[self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
// end<<<<<<
[UIView commitAnimations];
其中transition取值范围
typedefenum {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
} UIViewAnimationTransition;
特点:基础,使用方便,但是效果有限
二.block方式:使用UIView类的UIViewAnimationWithBlocks扩展
函数说明
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);//间隔,延迟,动画参数(好像没用?),界面更改块,结束块
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // delay = 0.0, options = 0
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // delay = 0.0, options = 0, completion = NULL
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // toView added to fromView.superview, fromView removed from its superview界面替换,这里的options参数有效
举例:
[UIView animateWithDuration:0.7 delay:0 options:0 animations:^(){
self.view.alpha = 0.2;
[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
self.view.alpha = 1;
} completion:^(BOOL finished)
{
}];
当areAnimationsEnabled为NO时,上面不能动画显示
[UIView transitionFromView:lImage toView:mImage duration:0.7 options:options completion:^(BOOL finished)
{
if (finished) {
[self.view addSubview:lImage];
[self.view sendSubviewToBack:lImage];
[self.view sendSubviewToBack:mImage];
}
}];
options取值范围
enum {
UIViewAnimationOptionLayoutSubviews = 1 << 0,
UIViewAnimationOptionAllowUserInteraction = 1 << 1, // turn on user interaction while animating
UIViewAnimationOptionBeginFromCurrentState = 1 << 2, // start all views from current value, not initial value
UIViewAnimationOptionRepeat = 1 << 3, // repeat animation indefinitely
UIViewAnimationOptionAutoreverse = 1 << 4, // if repeat, run animation back and forth
UIViewAnimationOptionOverrideInheritedDuration = 1 << 5, // ignore nested duration
UIViewAnimationOptionOverrideInheritedCurve = 1 << 6, // ignore nested curve
UIViewAnimationOptionAllowAnimatedContent = 1 << 7, // animate contents (applies to transitions only)
UIViewAnimationOptionShowHideTransitionViews = 1 << 8, // flip to/from hidden state instead of adding/removing
UIViewAnimationOptionCurveEaseInOut = 0 << 16, // default
UIViewAnimationOptionCurveEaseIn = 1 << 16,
UIViewAnimationOptionCurveEaseOut = 2 << 16,
UIViewAnimationOptionCurveLinear = 3 << 16,
UIViewAnimationOptionTransitionNone = 0 << 20, // default
UIViewAnimationOptionTransitionFlipFromLeft = 1 << 20,
UIViewAnimationOptionTransitionFlipFromRight = 2 << 20,
UIViewAnimationOptionTransitionCurlUp = 3 << 20,
UIViewAnimationOptionTransitionCurlDown = 4 << 20,
UIViewAnimationOptionTransitionCrossDissolve = 5 << 20,//ios5
UIViewAnimationOptionTransitionFlipFromTop = 6 << 20,//ios5
UIViewAnimationOptionTransitionFlipFromBottom = 7 << 20,//ios5
};
typedef NSUInteger UIViewAnimationOptions;
特点:快捷方便,效果更多.可以如上示例1那样实现界面个元素属性渐进变化的动态展示
三.core方式:使用CATransition类
使用要引入QuartzCore.framework
官方有个示例:ViewTransitions
基本上就是
CATransition *transition = [CATransition animation];
transition.duration = 0.7;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionMoveIn;//{kCATransitionMoveIn, kCATransitionPush, kCATransitionReveal, kCATransitionFade};
//更多私有{@"cube",@"suckEffect",@"oglFlip",@"rippleEffect",@"pageCurl",@"pageUnCurl",@"cameraIrisHollowOpen",@"cameraIrisHollowClose"};
transition.subtype = kCATransitionFromLeft;//{kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom};
transition.delegate = self;
[self.view.layer addAnimation:transition forKey:nil];
// 要做的
[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
UIView *aView=[[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]autorelease];
[self.view addSubview:aView];
//如果单纯的用UITouch 的时候只能用上面的,不能用下面的。
self.view=[[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]autorelease];
//2
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch=[touches anyObject];
CGRect frame1=touch.view.frame;
CGRect frame2=bView.frame;
if (frame1.origin.x==frame2.origin.x) {
//旋转。。
CGAffineTransform transform;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
transform=CGAffineTransformRotate(bView.transform, M_PI/3);//相对的。
// transform=CGAffineTransformMakeRotate(M_PI/3);//这里是绝对的。
bView.transform=transform;
[UIView commintModelAnimations];
//还原.
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
bView.transform=CGAffineTransformMakeScale(1.0f, 1.0f);
[UIView commintModelAnimations];
//翻转。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:bView cache:YES];
[UIView commintModelAnimations];
}
}
//3,用层,时需要QuartzCore/QuartzCore.h框架。
RootViewController *rootVC=[[RootViewController alloc] init];
self.window.rootViewController=rootVC;
[rootVC release];
//4用一个代理和一个类目实现顺序执行动画。
@interface UIViewDelegate : NSObject
{
CFRunLoopRef currentLoop;
}
-(id)initWithRunLoop:(CFRunLoopRef)runLoop;
-(void)animationFinished:(id)sender;
@end
@implementation UIViewDelegate
-(id)initWithRunLoop:(CFRunLoopRef)runLoop
{
self=[super init];
if (self) {
currentLoop=runLoop;
}
returnself;
}
-(void)animationFinished:(id)sender
{
CFRunLoopStop(currentLoop);
}
@end
@interface UIView (ModalAnimationHelper)
+(void)commintModelAnimations;
@end
#import "UIView+ModalAnimationHelper.h"
#import "UIViewDelegate.h"
@implementation UIView (ModalAnimationHelper)
+(void)commintModelAnimations
{
CFRunLoopRef currentLoop=CFRunLoopGetCurrent();
UIViewDelegate *uivdelegete=[[UIViewDelegate alloc] initWithRunLoop:currentLoop];
[UIView setAnimationDelegate:uivdelegete];
[uivdelegete release];
[UIView setAnimationDidStopSelector:@selector(animationFinished:)];
[UIView commitAnimations];
CFRunLoopRun();
}
@end
//5按钮控制的图片组合的动画。
self.view=[[[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds]autorelease];
[self.view setBackgroundColor:[UIColor grayColor]];
imageView=[[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 300)];
images=[[NSMutableArray alloc]initWithCapacity:8];
for (int i=0;i<8; i++) {
UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"h%d.jpeg",i+1]];
[images addObject:image];
}
imageView.animationImages=images;
[images release];
imageView.animationDuration=8;
//创建开始按钮。
UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
button.frame=CGRectMake(100, 400, 150, 50);
[button setTitle:@"开始/停止" forState:UIControlStateNormal];
[button addTarget:self action:@selector(doStartOrStop) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
[self.view addSubview:imageView];
[imageView release];
}
-(void)doStartOrStop{
if (m==0) {
[imageView startAnimating];
m=1;
}
else{
[imageView stopAnimating];
m=0;
}
}
//6触摸事件。
1.单击缩小视图。:
CGRect myFrame = self.view.frame;
myFrame.size.width -= self.frame.size.width * 0.1;
myFrame.size.height -= self.frame.size.height * 0.1;
myFrame.origin.x += (self.frame.origin.x * 0.1) / 2.0;
myFrame.origin.y += (self.frame.origin.y * 0.1) / 2.0;
[UIView beginAnimations:nil context:NULL];
[self.view setFrame:myFrame];
[UIView commitAnimations];
2.移动
UITouch *theTouch=[touches anyObject];
CGPoint currentTouchPosition=[theTouch locationInView:self];
if ((fabs(startTouchPosition.x-currentTouchPosition.x)>4&&fabs(startTouchPosition.y-currentTouchPosition.y)<=12)) {
if (startTouchPosition.x<currentTouchPosition.x) {
NSLog(@"swipe to right");
}
else{
NSLog(@"swipe to left");
}
}
CGPoint prevTouchPosition=[theTouch previousLocationInView:self];
CGRect viewFrame=self.frame;
float deltaX=currentTouchPosition.x-prevTouchPosition.x;
float deltaY=currentTouchPosition.y-prevTouchPosition.y;
viewFrame.origin.x+=deltaX;
viewFrame.origin.y+=deltaY;
[self setFrame:viewFrame];
UITouch *theTouch = [touches anyObject];
if (theTouch.tapCount == 2) {
[NSObject cancelPreviousPerformRequestsWithTarget:self];
}
startTouchPosition=[theTouch locationInView:self];
UIPinchGestureRecognizer *pinch=[[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(doPinch:)]autorelease];
[self addGestureRecognizer:pinch];
if (pinch.state==UIGestureRecognizerStateBegan) {
initialFontSize=label.font.pointSize;
}
else{
// label.font=[label.font fontWithSize:initialFontSize *pinch.scale];
self.frame=CGRectMake(self.frame.origin.x * pinch.scale,self.frame.origin.y * pinch.scale , self.frame.size.width *pinch.scale , self.frame.size.height *pinch.scale);
}
//7
//画一个正方形没有边框。
CGContextSetRGBFillColor(context, 0, 0.25, 0, 0.5);//创建设置颜色。最后一位是透明度。
CGContextFillRect(context, CGRectMake(2, 2, 70, 70));
CGContextStrokePath(context);
//写文字
CGContextSetLineWidth(context, 1.0);
CGContextSetRGBFillColor (context, 1, 1, 1, 1.0);
UIFont *font = [UIFont boldSystemFontOfSize:11.0];
[@"刘德华" drawInRect:CGRectMake(40, 40, 80, 20) withFont:font];
//画一条线
CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 0.5);//线条颜色
CGContextMoveToPoint(context, 20, 20);
CGContextAddLineToPoint(context, 200,20);
CGContextStrokePath(context);
//画正方形边框
CGContextSetRGBStrokeColor(context, 1, 1.0, 1.0, 1.0);
CGContextSetLineWidth(context, 2.0);
CGContextAddRect(context, CGRectMake(200, 200, 70, 70));
CGContextStrokePath(context);
CGContextDrawPath(context, kCGPathFillStroke);
//画一条线
CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 0.5);//线条颜色
CGContextMoveToPoint(context, 20, 20);
CGContextAddLineToPoint(context, 200,20);
CGContextStrokePath(context);
//8 关灯游戏。
-(void)drawRect:(CGRect)rect{
//循环生成28个view。
for (int i=1; i<=54; i++) {
UIView *xiaoDengView=[[UIView alloc]init];
xiaoDengView.tag=i;
if (m==6) {
m=0;
n++;
}
xiaoDengView.frame=CGRectMake(79*m-150, 0+64*n-125, 70, 46);
xiaoDengView.backgroundColor=[UIColor redColor];
m++;
[self addSubview:xiaoDengView];
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *theTouch=[touches anyObject];
a=theTouch.view.tag;//确定视图标签。
if (theTouch.tapCount==1) {
UIView *view1=[self viewWithTag:a];
UIView *view2=[self viewWithTag:(a+1)];
UIView *view3=[self viewWithTag:(a-1)];
UIView *view4=[self viewWithTag:(a+6)];
UIView *view5=[self viewWithTag:(a-6)];
//分别判断5个视图。
if ([view1.backgroundColor isEqual:[UIColor redColor]]) {
view1.backgroundColor=[UIColor blueColor];
}
else if([view1.backgroundColor isEqual:[UIColor blueColor]]){
view1.backgroundColor=[UIColor redColor];
}.......
}
}
//9轻拍",@"长按",@"轻扫",@"旋转",@"捏合",@"拖拽"
self.imageView=[[[UIImageView alloc]initWithFrame:CGRectMake(50, 40, 220, 320)]autorelease];
self.imageView.image=[UIImage imageNamed:@"h1.jpeg"];
self.imageView.userInteractionEnabled=YES;
[self.view addSubview:self.imageView];
//创建一个数组,该数组用于显示到segment上的文字。//单选按钮。
NSArray *titles=[NSArray arrayWithObjects:@"轻拍",@"长按",@"轻扫",@"旋转",@"捏合",@"拖拽",nil];
//创建UISegmentControl
UISegmentedControl *segment=[[UISegmentedControl alloc]initWithItems:titles];
segment.frame=CGRectMake(0, 420, 320, 40);
//为UISegmentControl添加方法。
segment.selectedSegmentIndex=0;
[segment addTarget:self action:@selector(clickSegment:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:segment];
[segment release];
//设置默认。
//创建轻拍手势,指定轻拍响应方法。
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
tap.numberOfTapsRequired=1;//默认为1.表示点击的次数。
//为imageView添加手势
[self.imageView addGestureRecognizer:tap];
[tap release];
//动画按钮。
UIButton *startButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
startButton.frame=CGRectMake(50, 370, 100, 40);
[startButton addTarget:self action:@selector(startAction:) forControlEvents:UIControlEventTouchUpInside];
[startButton setTitle:@"动画开始" forState:UIControlStateNormal];
[self.view addSubview:startButton];
UIButton *stopButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
stopButton.frame=CGRectMake(170, 370, 100, 40);
[stopButton addTarget:self action:@selector(stopAction:) forControlEvents:UIControlEventTouchUpInside];
[stopButton setTitle:@"动画停止" forState:UIControlStateNormal];
[self.view addSubview:stopButton];
//动画播放速度。
UISlider *slider=[[UISlider alloc]initWithFrame:CGRectMake(60, 5, 200, 20)];
slider.minimumValue=0.1;
slider.maximumValue=1.0;
slider.value=1;
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:slider];
[slider release];
}
-(void)clickSegment:(id)sender{
UISegmentedControl *segment=(UISegmentedControl *)sender;
//移除手势
for (UIGestureRecognizer *ges in self.imageView.gestureRecognizers) {
[self.imageView removeGestureRecognizer:ges];
}
//添加新的手势。
switch (segment.selectedSegmentIndex) {
case 0:
{
//创建轻拍手势,指定轻拍响应方法。
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
tap.numberOfTapsRequired=1;//默认为1.表示点击的次数。
//为imageView添加手势
[self.imageView addGestureRecognizer:tap];
[tap release];
}
break;
case 1:
{
//长按手势
UILongPressGestureRecognizer *longPress=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction:)];
[self.imageView addGestureRecognizer:longPress];
[longPress release];
}
break;
case 2:
{
//轻扫。
// for (int i=1; i<=8; i=i*2) {
// UISwipeGestureRecognizer *swip=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)];
// swip.direction=i;
// [self.imageView addGestureRecognizer:swip];
// [swip release];
// }
}
break;
case 3:
{
//旋转。
UIRotationGestureRecognizer *rotation=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationAction:)];
rotation.rotation=9;//旋转的弧度。
[self.imageView addGestureRecognizer:rotation];
[rotation release];
}
break;
case 4:
{
//捏合。
UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchAction:)];
[self.imageView addGestureRecognizer:pinch];
[pinch release];
}
break;
case 5:
{
//拖拽。
UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];
[self.imageView addGestureRecognizer:pan];
[pan release];
}
break;
default:
break;
}
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[touches anyObject];
startPoint=[touch locationInView:self.view];
}
//-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
// UITouch *touch=[touches anyObject];
// CGPoint currentPoint=[touch locationInView:self.view];
// if (fabs(startPoint.x-currentPoint.x)>=4&&(fabs(startPoint.y-currentPoint.y)<=12)) {
// NSLog(@"轻扫");
// NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];
// self.imageView.image=[UIImage imageNamed:imageName];
// }
//}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch=[touches anyObject];
CGPoint currentPoint=[touch locationInView:self.view];
if (fabs(startPoint.x-currentPoint.x)>=4&&(fabs(startPoint.y-currentPoint.y)<=12)) {
NSLog(@"轻扫");
NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];
self.imageView.image=[UIImage imageNamed:imageName];
}
}
//轻拍手势方法。
-(void)tapAction:(id)sender{
NSLog(@"轻拍");
NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];
self.imageView.image=[UIImage imageNamed:imageName];
}
//长按手势方法。
-(void)longPressAction:(id)sender{
NSLog(@"长按");
NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];
self.imageView.image=[UIImage imageNamed:imageName];
}
//轻扫手势方法。
-(void)swipeAction:(id)sender{
NSLog(@"轻扫");
NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];
self.imageView.image=[UIImage imageNamed:imageName];
}
//旋转手势方法。
-(void)rotationAction:(id)sender{
NSLog(@"旋转");
UIRotationGestureRecognizer *ro=(UIRotationGestureRecognizer *)sender;
self.imageView.transform=CGAffineTransformMakeRotation(ro.rotation);
}
//捏合手势方法。
-(void)pinchAction:(id)sender{
NSLog(@"捏合");
UIPinchGestureRecognizer *pin=(UIPinchGestureRecognizer *)sender;
self.imageView.transform=CGAffineTransformMakeScale(pin.scale, pin.scale);
}
//拖拽手势方法。
-(void)panAction:(id)sender{
NSLog(@"拖拽");
UIPanGestureRecognizer *pan=(UIPanGestureRecognizer *)sender;
if (pan.state==UIGestureRecognizerStateBegan) {//拖拽开始。
//记录最初的坐标点。
oldPoint=[pan locationInView:self.view];
}
//当前的坐标点,并计算偏移量。
CGPoint newPoint=[pan locationInView:self.view];
CGFloat offSetX=newPoint.x-oldPoint.x;
CGFloat offSetY=newPoint.y-oldPoint.y;
//为ImageView的中心赋值。
self.imageView.center=CGPointMake(pan.view.center.x+offSetX, pan.view.center.y+offSetY);
//保留已经用过的坐标点。
oldPoint =newPoint;
}
//开始动画。
-(void)startAction:(id)sender{
//创建数组,保存一组图片。
NSMutableArray *mArray=[[NSMutableArray alloc]init];
for (int i=1; i<=6; i++) {
NSString *imageName=[[NSString alloc]initWithFormat:@"run%d.tiff",i];
UIImage *image=[UIImage imageNamed:imageName];
[mArray addObject:image];
[imageName release];
}
//为imageView的动画图片数组赋值。
self.imageView.animationImages=mArray;
//设定事件,默认持续时间
self.imageView.animationDuration=3;
//播放动画
[self.imageView startAnimating];
}
-(void)stopAction:(id)sender{
//动画停止。
[self.imageView stopAnimating];
}
//加速控制UISlider的方法。
-(void)sliderAction:(id)sender{
UISlider *slider=(UISlider *)sender;
//判断imageView动画是否开始。
if ([self.imageView isAnimating]) {
[self.imageView stopAnimating];
self.imageView.animationDuration=slider.value;
[self.imageView startAnimating];
}
}
//10不同先画画,小鸟会走。
smallImage =[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
smallImage.image=[UIImage imageNamed:@"鸟.png"];
[self addSubview:smallImage];
[smallImage release];
UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
button.frame=CGRectMake(250, 320, 60, 40);
[button setTitle:@"走" forState:UIControlStateNormal];
[button addTarget:self action:@selector(doFlay) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
// [button release];//没有初始化时候,release就没有了。
// Initialization code
lineArray =[[NSMutableArray alloc]init];
colorArray=[[NSMutableArray alloc]init];
color=0;
//初始化两个按钮。
UIButton *btn1=[[UIButton alloc]initWithFrame:CGRectMake(250, 420, 70, 40)];
[btn1 setTitle:@"撤销" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(undo) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn1];
UIButton *btn2=[[UIButton alloc]initWithFrame:CGRectMake(20, 420, 70, 40)];
[btn2 setTitle:@"重新画" forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(undoAll) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn2];
//初始化segment
NSArray *titles=[[NSArray alloc]initWithObjects:@"红",@"绿",@"蓝", nil];
UISegmentedControl *segment=[[UISegmentedControl alloc]initWithItems:titles];
segment.frame=CGRectMake(0, 380, 320, 40);
[segment addTarget:self action:@selector(segment:) forControlEvents:UIControlEventValueChanged];
[self addSubview:segment];
[segment release];
}
returnself;
}
- (void)drawRect:(CGRect)rect
{
//开始画画了。
context =UIGraphicsGetCurrentContext();
for (int i=0; i<[lineArray count]; i++) {
pointArray =[lineArray objectAtIndex:i];
if ([[colorArray objectAtIndex:i]intValue]==0) {
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
}
if ([[colorArray objectAtIndex:i]intValue]==1) {
CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
}
if ([[colorArray objectAtIndex:i]intValue]==2) {
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
}
CGContextSetLineWidth(context, 4.0f);
if ([pointArray count]>1) {
for (int j=0; j<[pointArray count]-1; j++) {
NSValue *a=[pointArray objectAtIndex:j];
CGPoint c=[a CGPointValue];
NSValue *b=[pointArray objectAtIndex:j+1];
CGPoint d=[b CGPointValue];
CGContextMoveToPoint(context, c.x, c.y);
CGContextAddLineToPoint(context, d.x, d.y);
}
}
CGContextStrokePath(context);
}
}
-(void)doFlay{//设置经过的点。也就是路径。
CAKeyframeAnimation *animation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
// NSArray *values=[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(100, 20)],[NSValue valueWithCGPoint:CGPointMake(40, 80)],[NSValue valueWithCGPoint:CGPointMake(30, 60)],[NSValue valueWithCGPoint:CGPointMake(20, 40)],[NSValue valueWithCGPoint:CGPointMake(0, 10)], nil];
NSArray *values=[NSArray arrayWithArray:pointArray];
[animation setValues:values];
[animation setDuration:4.0];
// [animation setDelegate:self];
// [bigImage.layer addAnimation:animation forKey:@"image-position"];
[smallImage.layer addAnimation:animation forKey:@"image-position"];
}
-(void)undo{
[lineArray removeLastObject];
[colorArray removeLastObject];
[self setNeedsDisplay];
}
-(void)undoAll{
[lineArray removeAllObjects];
[colorArray removeAllObjects];
[self setNeedsDisplay];
}
-(void)segment:(id)sender{
UISegmentedControl *tempSegment=(UISegmentedControl *)sender;
color=tempSegment.selectedSegmentIndex;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[touches anyObject];
firstPoint=[touch locationInView:self];
pointArray=[[NSMutableArray alloc]init];
[lineArray addObject:pointArray];
[colorArray addObject:[NSNumber numberWithInt:color]];
[pointArray release];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[touches anyObject];
lastPoint=[touch locationInView:self];
NSValue *value=[NSValue valueWithCGPoint:lastPoint];
pointArray =[lineArray lastObject];
[pointArray addObject:value];
// [self setNeedsDisplayInRect:CGRectMake(firstPoint.x, firstPoint.y, lastPoint.x-firstPoint.x, lastPoint.y-firstPoint.y)];
[self setNeedsDisplay];
}
//11唐老师最后一节课层动画。
bigImage=[[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 150, 250)];
NSString *str=[[NSBundle mainBundle]pathForResource:@"气球" ofType:@"png"];
bigImage.image=[UIImage imageWithContentsOfFile:str];
[self.view addSubview:bigImage];
[bigImage release];
smallImage=[[UIImageView alloc]initWithFrame:CGRectMake(0, 80, 30, 30)];
smallImage.image=[UIImage imageNamed:@"鸟.png"];
[bigImage addSubview:smallImage];
[smallImage release];
//layer
[bigImage.layer setCornerRadius:20];/////////图上是绿矩形的角平滑度。
[bigImage.layer setShadowColor:[UIColor blackColor].CGColor];//阴影颜色。
//bigImage.layer.masksToBounds=YES;//给视图添加注释。和阴影不能一起写。
[bigImage.layer setShadowOffset:CGSizeMake(20, 20)];//设置阴影的起点位置
[bigImage.layer setShadowOpacity:0.5];//不透明度。0为全透明。
[bigImage.layer setBorderColor:[UIColor greenColor].CGColor];
[bigImage.layer setBorderWidth:2];
//生成对应的十个按钮。
for (int i=0; i<10; i++) {
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.tag=i+1;
if (button.tag>7) {
button.frame=CGRectMake(15+80*(i-7), 415, 60, 40);
}
else{
button.frame=CGRectMake(255, 20+i*60, 60, 40);
}
[self.view addSubview:button];
}
NSArray *array=[NSArray arrayWithObjects:@"1",@"2", nil];
segmented=[[UISegmentedControl alloc]initWithItems:array];
segmented.frame=CGRectMake(30, 350, 100, 40);
[self.view addSubview:segmented];
[segmented release];
//分别给按钮关联方法。
UIButton *move=(UIButton *)[self.view viewWithTag:1];
[move setTitle:@"move" forState:UIControlStateNormal];
[move addTarget:self action:@selector(doChangeFrameToMove) forControlEvents:UIControlEventTouchUpInside];
//转动。
UIButton *translate=(UIButton *)[self.view viewWithTag:2];
[translate setTitle:@"translate" forState:UIControlStateNormal];
[translate addTarget:self action:@selector(doTranslate) forControlEvents:UIControlEventTouchUpInside];
//旋转。
UIButton *rotate=(UIButton *)[self.view viewWithTag:3];
[rotate setTitle:@"rotate" forState:UIControlStateNormal];
[rotate addTarget:self action:@selector(doRotate) forControlEvents:UIControlEventTouchUpInside];
//比例,规模。
UIButton *scale=(UIButton *)[self.view viewWithTag:4];
[scale setTitle:@"scale" forState:UIControlStateNormal];
[scale addTarget:self action:@selector(doScale) forControlEvents:UIControlEventTouchUpInside];
//转化为
UIButton *invert=(UIButton *)[self.view viewWithTag:5];
[invert setTitle:@"invert" forState:UIControlStateNormal];
[invert addTarget:self action:@selector(doInvert) forControlEvents:UIControlEventTouchUpInside];
//卷。
UIButton *curlUp=(UIButton *)[self.view viewWithTag:6];
[curlUp setTitle:@"curlUp" forState:UIControlStateNormal];
[curlUp addTarget:self action:@selector(doCurlUp) forControlEvents:UIControlEventTouchUpInside];
//轻击,弹
UIButton *flip=(UIButton *)[self.view viewWithTag:7];
[flip setTitle:@"flip" forState:UIControlStateNormal];
[flip addTarget:self action:@selector(doFlip) forControlEvents:UIControlEventTouchUpInside];
//不透明。
UIButton *opacity=(UIButton *)[self.view viewWithTag:8];
[opacity setTitle:@"opacity" forState:UIControlStateNormal];
[opacity addTarget:self action:@selector(doOpacity) forControlEvents:UIControlEventTouchUpInside];
//花费
UIButton *expend=(UIButton *)[self.view viewWithTag:9];
[expend setTitle:@"expend" forState:UIControlStateNormal];
[expend addTarget:self action:@selector(doExpend) forControlEvents:UIControlEventTouchUpInside];
UIButton *flay=(UIButton *)[self.view viewWithTag:10];
[flay setTitle:@"flay" forState:UIControlStateNormal];
[flay addTarget:self action:@selector(doFlay) forControlEvents:UIControlEventTouchUpInside];
}
-(void)doChangeFrameToMove{
[UIView beginAnimations:nil context:nil];//第一个参数是动画的标石,第二个参数是应用程序传递给动画的代理的信息。通常不写,
[UIView setAnimationDuration:2];//动画持续时间。
// [UIView setAnimationDelegate:self];//设置动画的回调函数,设置后可以使用回调方法。也就 是代理方法。
// [UIView setAnimationDidStopSelector:@selector(a:)];//动画完毕后调用的方法。“”不被新IOS版本支持。、
if (n==0) {
smallImage.frame=CGRectMake(130, 80, 30, 30);
n++;
}
else{
smallImage.frame = CGRectMake(0, 80, 30, 30);
n=0;
}
[UIView commitAnimations];
}
-(void)doTranslate
{
// NSLog(@"%s",__FUNCTION__);
CGAffineTransform transform;
if (segmented.selectedSegmentIndex==0) {
transform=CGAffineTransformTranslate(bigImage.transform, 10.0, 10.0);
}
else
{
transform=CGAffineTransformMakeTranslation(10.0, 10.0);
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.2];
[bigImage setTransform:transform];
[UIView commitAnimations];
}
-(void)doRotate{
NSLog(@"%s",__FUNCTION__);
CGAffineTransform transform;
if (segmented.selectedSegmentIndex==0) {
//根据目标对象当前的transform进行旋转。
transform=CGAffineTransformRotate(bigImage.transform,M_PI/6.0);
}
else{
//根据原始位置旋转。
transform=CGAffineTransformMakeRotation(M_PI/6.0);
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.2];
[bigImage setTransform:transform];
[UIView setAnimationDelegate:self];
// [UIView setAnimationDidStopSelector:@selector(animationAction)];
[UIView commitAnimations];
}
-(void)doScale{
NSLog(@"%s",__FUNCTION__);
CGAffineTransform transform;
if (segmented.selectedSegmentIndex==0) {
transform=CGAffineTransformScale(bigImage.transform,1.2,1.2);
}
else{
transform=CGAffineTransformMakeScale(1.2, 1.2);
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.2];
[bigImage setTransform:transform];
[UIView commitAnimations];
}
-(void)doInvert{
NSLog(@"%s",__FUNCTION__);
CGAffineTransform transform;
if (segmented.selectedSegmentIndex==0) {
transform=CGAffineTransformIdentity;
}
else{
transform=CGAffineTransformInvert(bigImage.transform);
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.2];
[bigImage setTransform:transform];
[UIView commitAnimations];
}
-(void)doCurlUp{
NSLog(@"%s",__FUNCTION__);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//指定动画曲线类型。淡入淡出。
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:bigImage cache:YES];//设置动画的样式,forview为哪个动画实现这个效果。yes 时候阴影一起走。
[UIView commitAnimations];
}
-(void)doFlip{
NSLog(@"%s",__FUNCTION__);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:1];
if (m==0) {
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:bigImage cache:YES];
NSLog(@"xiang you");
m=1;
}
else{
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:bigImage cache:YES];
m=0;
NSLog(@"xiang zuo");
}
[UIView commitAnimations];
}
-(void)doOpacity{
NSLog(@"%s",__FUNCTION__);
//创建基本动画。@里的字符串有多种,必须写对才行,这个是透明度。
CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"opacity"];//制定操作的属性
//操作属性的起始值;透明度的。
[animation setFromValue:[NSNumber numberWithFloat:1.0]];
//操作属性的终点。
[animation setToValue: [NSNumber numberWithFloat:0.0]];
//动画持续时间。
[animation setDuration:3.0];
//重复次数。
[animation setRepeatCount:3.0];
[animation setDelegate:self];
[animation setAutoreverses:YES];//默认的是NO即透明完毕后立马恢复,YES是延迟恢复。
[bigImage.layer addAnimation:animation forKey:@"img-opacity"];//执行动画。
}
-(void)doExpend{
CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"bounds.size"];
[animation setFromValue:[NSValue valueWithCGSize:CGSizeMake(1.0, 1.0)]];
[animation setToValue: [NSValue valueWithCGSize:bigImage.bounds.size]];//设置回原来的大小。
[animation setDuration:1.2];
[animation setDelegate:self];
[bigImage.layer addAnimation:animation forKey:@"image-bounds.size"];
}
-(void)doFlay{//设置经过的点。也就是路径。
CAKeyframeAnimation *animation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
NSArray *values=[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(100, 20)],[NSValue valueWithCGPoint:CGPointMake(40, 80)],[NSValue valueWithCGPoint:CGPointMake(30, 60)],[NSValue valueWithCGPoint:CGPointMake(20, 40)],[NSValue valueWithCGPoint:CGPointMake(0, 10)], nil];
[animation setValues:values];
[animation setDuration:1.0];
[animation setDelegate:self];
[bigImage.layer addAnimation:animation forKey:@"image-position"];
}
//动画开始时调用。
-(void)animationDidStart:(CAAnimation *)anim{
NSLog(@"%s",__FUNCTION__);
}
//动画结束时,他们都是自动调用,
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
NSLog(@"%s",__FUNCTION__);
if (flag) {
CAPropertyAnimation *propertAn=(CAPropertyAnimation *)anim;
[bigImage.layer removeAnimationForKey:propertAn.keyPath];
NSLog(@"keyPath=%@",propertAn.keyPath);
}
}
//指定动画的代理对象,两个代理方法的selector应该满足一下格式。、但是现在不允许用了。,
-(void)animationDidStop:(NSString *)animationId finished:(NSNumber *)finished context:(void*)context{
NSString *str=(NSString *)context;
if ([str isEqualToString:@"move"]) {
[smallImage setAlpha:0];
}
}
相关推荐
iOS动画 - 几种特殊的layer动画
三种常见的炫丽的layer动画,分别是CAReplicatorLayer、CAEmitterLayer和CAGradientLayer。 简书:http://www.jianshu.com/p/fa8e80766529 github地址:https://github.com/XuanYuLin/YUFoldingTableView 谢谢!
IOS中基于layer的相关动画, Quartz2D框架中接口使用案例
主要介绍了IOS 中CALayer绘制图片的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
- [iOS动画和特效(五)layer隐式动画](http://liuyanwei.jumppo.com/2015/11/16/iOS-Implicit-Animation.html) - [iOS动画和特效(六)swift动画库spring使用和代码拆解]...
很简易的一款加载框。 地址:https://github.com/Cherishforever/ReplicatorLayer
ArcGIS API for iOS 使您可使用 Objective C 构建多种应用程序(这些应用程序将运用 ArcGIS Server 提供的强大制图、地理编码、地理处理和自定义功能)并将它们部署到 Apple iPhone、iPod Touch 和 iPad 设备。...
一个简单的loading动画轮子 可用于loading
iOS的系统架构分为四个层次:核心操作系统层(the Core OS layer),核心服务层(the Core Services layer),媒体层(the Media layer),可轻触层(the Cocoa Touch layer)。系统操作占用大概240MB的存储器空间。
用于iOS的聊天和消息UI组件,可与Layer配合使用
交流分享果断抛弃layer的对话框,自己写了一个对话框,兼容Android和IOS
Atlas-iOS.zip,用于iOS的聊天和消息传递UI组件,专为使用Layer而构建
一个自字定义的环形转圈,并自动计时,的动画效果,也...比传统的,手动滑动索引,更吸引用用户使用!可以滑动,也可自动进行计时,也可以在最上面的scroller上面的每一页,加自己想要的动画,具体请参考“赤兔”app
An in-depth look into Mac OS X and iOS kernels Powering Macs, iPhones, iPads and more, ...Dissects the kernel, XNU, into its sub components: Mach, the BSD Layer, and I/o kit, and explains each in detail
A book on creating delightful... From beginning to advanced topics like layer animations, view controller transitions, and more. Currently updated to: Platform: iOS13; Language: Swift5.1; Editor: Xcode11
Create, arrange, draw, layer, and animate views that respond to touch Use view controllers to manage multiple interface screens Master interface classes for scroll views, table views, text, popovers, ...
主要为大家详细介绍了IOS CoreAnimation中layer动画闪烁的原因,分享了layer动画闪烁的解决方法,感兴趣的小伙伴们可以参考一下
* kCAFillModeRemoved 默认,当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态 * kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态 * kCAFillModeBackwards...
iOS 链式动画组件库.zip,Anima is chainable Layer-Based Animation library for Swift4.
仿芝麻评分,在视图的layer层进行绘制