天天看點

iOS 各種動畫,簡單實作(閃爍、移動、旋轉、路徑、組合)

作者:ITEER

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

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

- (void)viewDidLoad

{

[superviewDidLoad];

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

self.view.backgroundColor = [UIColorlightGrayColor];

myTest1 = [[UILabelalloc]initWithFrame:CGRectMake(10, 100, 60, 40)];

myTest1.backgroundColor = [UIColorblueColor];

myTest1.textAlignment = NSTextAlignmentCenter;

myTest1.text = @"張明炜";

myTest1.textColor = [UIColorwhiteColor];

[self.viewaddSubview: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.layeraddAnimation:[selfrotation:2degree:kRadianToDegrees(90) direction:1repeatCount:MAXFLOAT] forKey:nil];

}

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

-(CABasicACnimation *)opacityForever_Animation:(float)time

{

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

animation.fromValue = [NSNumbernumberWithFloat:1.0f];

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

animation.autoreverses = YES;

animation.duration = time;

animation.repeatCount = MAXFLOAT;

animation.removedOnCompletion = NO;

animation.fillMode = kCAFillModeForwards;

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

return animation;

}

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

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

{

CABasicAnimation *animation = [CABasicAnimationanimationWithKeyPath:@"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 = [CABasicAnimationanimationWithKeyPath:@"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 = [CAAnimationGroupanimation];

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 = [CAKeyframeAnimationanimationWithKeyPath:@"position"];

animation.path = path;

animation.removedOnCompletion = NO;

animation.fillMode = kCAFillModeForwards;

animation.timingFunction = [CAMediaTimingFunctionfunctionWithName: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 = [CABasicAnimationanimationWithKeyPath:@"transform"];

animation.toValue = [NSValue valueWithCATransform3D:rotationTransform];

animation.duration = dur;

animation.autoreverses = NO;

animation.cumulative = NO;

animation.fillMode = kCAFillModeForwards;

animation.repeatCount = repeatCount;

animation.delegate = self;

return animation;

}