CAAnimation動畫--(旋轉/縮放/移動/閃爍)


//

//  ViewController.m

//  animation

//

//  Created by xueshan on 16/12/15.

//  Copyright © 2016 xueshan. All rights reserved.

//

 

#import "ViewController.h"

#define kDegreesToRadian(x) (M_PI * (x) / 180.0)

 

#define kRadianToDegrees(radian) (radian*180.0)/(M_PI)

 

@interface ViewController ()

{

    UILabel *myTest1;

}

@end

 

@implementation ViewController

 

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    self.title = @"測試動畫";

    self.view.backgroundColor = [UIColor lightGrayColor];

    

    

    myTest1 = [[UILabel alloc]initWithFrame:CGRectMake(150, 100, 100, 100)];

    myTest1.backgroundColor = [UIColor blueColor];

    myTest1.textAlignment = NSTextAlignmentCenter;

    myTest1.text = @"張明煒";

    myTest1.textColor = [UIColor whiteColor];

    [self.view addSubview:myTest1];

    

    //閃爍效果。

    //    [myTest1.layer addAnimation:[self opacityForever_Animation:0.5] forKey:nil];

    ///移動的動畫。

    //    [myTest1.layer addAnimation:[self moveX:1.0f X:[NSNumber numberWithFloat:200.0f]] forKey:nil];

    //縮放效果。

    //    [myTest1.layer addAnimation:[self scale:[NSNumber numberWithFloat:1.0f] orgin:[NSNumber numberWithFloat:3.0f] durTimes:2.0f Rep:MAXFLOAT] forKey:nil];

    //組合動畫。

    //    NSArray *myArray = [NSArray arrayWithObjects:[self opacityForever_Animation:0.5],[self moveX:1.0f X:[NSNumber numberWithFloat:200.0f]],[self scale:[NSNumber numberWithFloat:1.0f] orgin:[NSNumber numberWithFloat:3.0f] durTimes:2.0f Rep:MAXFLOAT], nil];

    //    [myTest1.layer addAnimation:[self groupAnimation:myArray durTimes:3.0f Rep:MAXFLOAT] forKey:nil];

    //路徑動畫。

    //    CGMutablePathRef myPah = CGPathCreateMutable();

    //    CGPathMoveToPoint(myPah, nil,30, 77);

    //    CGPathAddCurveToPoint(myPah, nil, 50, 50, 60, 200, 200, 200);//這里的是控制點。

    //    [myTest1.layer addAnimation:[self keyframeAnimation:myPah durTimes:5 Rep:MAXFLOAT] forKey:nil];

    //旋轉動畫。

    [myTest1.layer addAnimation:[self rotation:1 degree:kRadianToDegrees(360) direction:1 repeatCount:MAXFLOAT] forKey:nil];

    

    

}

 

#pragma mark === 永久閃爍的動畫 ======

-(CABasicAnimation *)opacityForever_Animation:(float)time

{

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];//必須寫opacity才行。

    animation.fromValue = [NSNumber numberWithFloat:1.0f];

    animation.toValue = [NSNumber numberWithFloat:0.0f];//這是透明度。

    animation.autoreverses = YES;

    animation.duration = time;

    animation.repeatCount = MAXFLOAT;

    animation.removedOnCompletion = NO;

    animation.fillMode = kCAFillModeForwards;

    animation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];///沒有的話是均勻的動畫。

    return animation;

}

 

#pragma mark =====橫向、縱向移動===========

-(CABasicAnimation *)moveX:(float)time X:(NSNumber *)x

{

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];///.y的話就向下移動。

    animation.toValue = x;

    animation.duration = time;

    animation.removedOnCompletion = NO;//yes的話,又返回原位置了。

    animation.repeatCount = MAXFLOAT;

    animation.fillMode = kCAFillModeForwards;

    return animation;

}

 

#pragma mark =====縮放-=============

-(CABasicAnimation *)scale:(NSNumber *)Multiple orgin:(NSNumber *)orginMultiple durTimes:(float)time Rep:(float)repertTimes

{

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];

    animation.fromValue = Multiple;

    animation.toValue = orginMultiple;

    animation.autoreverses = YES;

    animation.repeatCount = repertTimes;

    animation.duration = time;//不設置時候的話,有一個默認的縮放時間.

    animation.removedOnCompletion = NO;

    animation.fillMode = kCAFillModeForwards;

    return  animation;

}

 

#pragma mark =====組合動畫-=============

-(CAAnimationGroup *)groupAnimation:(NSArray *)animationAry durTimes:(float)time Rep:(float)repeatTimes

{

    CAAnimationGroup *animation = [CAAnimationGroup animation];

    animation.animations = animationAry;

    animation.duration = time;

    animation.removedOnCompletion = NO;

    animation.repeatCount = repeatTimes;

    animation.fillMode = kCAFillModeForwards;

    return animation;

}

 

#pragma mark =====路徑動畫-=============

-(CAKeyframeAnimation *)keyframeAnimation:(CGMutablePathRef)path durTimes:(float)time Rep:(float)repeatTimes

{

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

    animation.path = path;

    animation.removedOnCompletion = NO;

    animation.fillMode = kCAFillModeForwards;

    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

    animation.autoreverses = NO;

    animation.duration = time;

    animation.repeatCount = repeatTimes;

    return animation;

}

 

#pragma mark ====旋轉動畫======

-(CABasicAnimation *)rotation:(float)dur degree:(float)degree direction:(int)direction repeatCount:(int)repeatCount

{

    CATransform3D rotationTransform = CATransform3DMakeRotation(degree, 0, 0, direction);

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];

    animation.toValue = [NSValue valueWithCATransform3D:rotationTransform];

    animation.duration  =  dur;

    animation.autoreverses = NO;

    animation.cumulative = YES;

    animation.fillMode = kCAFillModeForwards;

    animation.repeatCount = 100;

    animation.delegate = self;

    

    return animation;

    

    

    

    //以下兩行同時設置才能保持移動后的位置狀態不變

    

    //rotationAnimation.fillMode=kCAFillModeForwards;

    //rotationAnimation.removedOnCompletion = NO;

}

 

 

//圖片旋轉

+ (UIImageView *)rotate360DegreeWithImageView:(UIImageView *)imageView{

    CABasicAnimation *animation = [ CABasicAnimation

                                   animationWithKeyPath: @"transform" ];

    animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];

    

    //圍繞Z軸旋轉,垂直與屏幕

    animation.toValue = [ NSValue valueWithCATransform3D:

                         

                         CATransform3DMakeRotation(M_PI, 0.0, 0.0, 1.0) ];

    animation.duration = 0.5;

    //旋轉效果累計,先轉180度,接着再旋轉180度,從而實現360旋轉

    animation.cumulative = YES;

    animation.repeatCount = 1000;

    

    //在圖片邊緣添加一個像素的透明區域,去圖片鋸齒

    CGRect imageRrect = CGRectMake(0, 0,imageView.frame.size.width, imageView.frame.size.height);

    UIGraphicsBeginImageContext(imageRrect.size);

    [imageView.image drawInRect:CGRectMake(1,1,imageView.frame.size.width-2,imageView.frame.size.height-2)];

    imageView.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    

    [imageView.layer addAnimation:animation forKey:nil];

    return imageView;

}

 

//animation.repeatCount = 1000;

//這個你要想一直旋轉,設置一個無窮大就得了

//

//停止的話直接這樣就停止了

//[self.view.layer removeAllAnimates];

 

 

 

 

 

 

 

 

 

 

 

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM