iOS簡單動畫效果:閃爍、移動、旋轉、路徑、組合、
阿新 • • 發佈:2019-02-06
#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; }