最近做一个功能,类似于系统删除APP的效果。见下面代码:
1、通过UIView动画效果
-(void)BeginShake
{
srand([[NSDate date] timeIntervalSince1970]);
float rand=(float)random();
CFTimeInterval t=rand*0.0000000001;
[UIView animateWithDuration:0.1 delay:t options:0 animations:^
{
self.hahahView.transform=CGAffineTransformMakeRotation(-0.05);
} completion:^(BOOL finished){
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionRepeat|UIViewAnimationOptionAutoreverse|UIViewAnimationOptionAllowUserInteraction animations:^
{
self.hahahView.transform=CGAffineTransformMakeRotation(0.05);
} completion:nil];
}];
}
-(void)EndShake
{
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState animations:^{
self.hahahView.transform=CGAffineTransformIdentity;
} completion:nil];
}
//附带
UIViewAnimationOptionLayoutSubviews // 所有子视图跟随一起动画(默认)
UIViewAnimationOptionAllowUserInteraction // 动画过程中允许交互操作,但是响应的位置以视图动画最终位置为准
UIViewAnimationOptionBeginFromCurrentState // 从当前的状态开始动画
UIViewAnimationOptionRepeat // 重复执行动画,单次动画结束,瞬间变为初始状态继续进行动画,依此循环
UIViewAnimationOptionAutoreverse // 往返执行动画,单次动画结束,沿原路径返回反向执行,要与UIViewAnimationOptionRepeat同时使用
UIViewAnimationOptionOverrideInheritedDuration // 在嵌套动画中,不受父层动画时间影响。默认情况下子层继承父层动画时间,忽略自己的时间
UIViewAnimationOptionOverrideInheritedCurve // 在嵌套动画中,不受父层属性动画时间(如UIViewAnimationOptionCurveEaseInOut)影响
UIViewAnimationOptionAllowAnimatedContent // 允许多个动画同时执行
UIViewAnimationOptionShowHideTransitionViews // 控制两个动画视图的显示和隐藏(功能类似于addsubview+removefromsuperview),使用这个属性(一般在transitionFromView:toView:duration:options:completion:这个方法中使用),fromView会被隐藏,toView会被显示
UIViewAnimationOptionOverrideInheritedOptions // 不使用任何选项
/* 动画速度方式 */
UIViewAnimationOptionCurveEaseInOut // 慢->快->慢
UIViewAnimationOptionCurveEaseIn // 慢->快
UIViewAnimationOptionCurveEaseOut // 快->慢
UIViewAnimationOptionCurveLinear // 匀速
/* 动画过渡方式 */
UIViewAnimationOptionTransitionNone // 不指定过度方式
UIViewAnimationOptionTransitionFlipFromLeft // 从左侧翻转
UIViewAnimationOptionTransitionFlipFromRight // 从右侧翻转
UIViewAnimationOptionTransitionCurlUp // 从上部翻页
UIViewAnimationOptionTransitionCurlDown // 从下部翻页
UIViewAnimationOptionTransitionCrossDissolve // 动画初始位置状态由显示逐渐透明隐藏,动画结束位置状态由透明逐渐变为显示
UIViewAnimationOptionTransitionFlipFromTop // 从上部翻转
UIViewAnimationOptionTransitionFlipFromBottom // 从下部翻转
UIViewAnimationOptionPreferredFramesPerSecondDefault // 默认
UIViewAnimationOptionPreferredFramesPerSecond60 // 每秒60帧的刷新速率
UIViewAnimationOptionPreferredFramesPerSecond30 // 每秒30帧的刷新速率
2、通过CABaseAnimation
- (void)viewDidLoad {
[super viewDidLoad];
self.hahahView.layer.contents = (__bridge id)([UIImage imageNamed: @"a"].CGImage);
}
- (IBAction)addAnimation:(id)sender {
CAKeyframeAnimation *keyAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
keyAnimation.values = @[@(-M_PI_4 * 0.1 * 1), @(M_PI_4 * 0.1 * 1), @(-M_PI_4 * 0.1 * 1)];
keyAnimation.repeatCount = CGFLOAT_MAX;
[self.hahahView.layer addAnimation:keyAnimation forKey:@"keyAnimation"];
}
- (IBAction)cancelAnimation:(id)sender {
[self.hahahView.layer removeAllAnimations];
}