iOS 几种简单动画
UIView 动画
UILabel *lab = [[UILabel alloc]initWithFrame:CGRectMake(10, 40, 100, 80)];
lab.textAlignment = NSTextAlignmentCenter;
lab.text = @"测试滑块";
lab.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:lab];
/*
[UIView animateWithDuration:2.0f animations:^{
lab.center = CGPointMake(200, 300);
} completion:^(BOOL finished) {
NSLog(@"动画完成!");
}];*/
[UIView animateKeyframesWithDuration:2.0f/*动画时长*/ delay:1.0f/*延时时长*/ options:UIViewKeyframeAnimationOptionRepeat/*动画类型*/ animations:^{/*动画执行内容*/
lab.center = CGPointMake(200, 300);
} completion:^(BOOL finished) {/*动画结束处理*/
NSLog(@"动画完成!");
}];
UIImageView 动画
NSMutableArray *array = [NSMutableArray array];
for (int i = 1 ; i < 16; i++) {
NSString *imageName = [NSString stringWithFormat:@"login_%d",i];
UIImage *image = [UIImage imageNamed:imageName];
[array addObject:image];
}
_imageView.animationImages = array;//动画图片内容
_imageView.animationDuration = 1.0f;//动画时长
_imageView.animationRepeatCount = 10;//动画重复次数
[_imageView startAnimating];//开始执行动画
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if ([_imageView isAnimating]/*判断当前是否正在动画执行中*/) {
[_imageView stopAnimating];//结束执行动画
}
});
CABasicAnimation 动画
// 创建CABasicAnimation
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
anim.duration = 1.5; // 动画持续1.5s
anim.repeatCount = 2;//动画重复次数 default is 1
anim.beginTime = 1.0f;// 动画延迟时间 default is 0
//动画执行的过程中 先快后慢 先慢后快 匀速 等方式完成动画
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.autoreverses = NO;//动画结束的时候是否要按原来返回到原来的状态
anim.fromValue = @1.0f;//动画改变起始值
anim.toValue = @0.5;//动画改变结束值
// anim.byValue 和初始状态相比的改变量
anim.delegate = self;//delegate 可以监听到动画开始和动画结束
// 动画结束的时候,保持结束时的状态
anim.removedOnCompletion = NO;
// 始终保持最新的效果
anim.fillMode = kCAFillModeForwards;
[textView.layer addAnimation:anim forKey:nil];
//动画开始时
- (void)animationDidStart:(CAAnimation *)anim
{
NSLog(@"开始了");
}
//动画结束时
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
//方法中的flag参数表明了动画是自然结束还是被打断,比如调用了removeAnimationForKey:方法或removeAnimationForKey方法,flag为NO,如果是正常结束,flag为YES。
NSLog(@"结束了");
}
给一个视图添加layer动画时,真正移动并不是我们的视图本身,而是 presentation layer 的一个缓存。动画开始时 presentation layer开始移动,原始layer隐藏,动画结束时,presentation layer从屏幕上移除,原始layer显示。
解释了为什么我们的视图在动画结束后又回到了原来的状态。
可以解释为什么在动画移动过程中,不能响应任何操作。
完成layer动画之后,一般是将layer属性设置为最终状态的属性
// 动画结束的时候,保持结束时的状态
anim.removedOnCompletion = NO;
// 始终保持最新的效果
anim.fillMode = kCAFillModeForwards;
如果有特殊需求,希望动画完成后 再回到原来的状态 就不用设置这两个属性
一些常用的animationWithKeyPath值的总结
值 说明 使用形式
transform.scale 比例转化 @(0.8)
transform.scale.x 宽的比例 @(0.8)
transform.scale.y 高的比例 @(0.8)
transform.rotation.x 围绕x轴旋转 @(M_PI)
transform.rotation.y 围绕y轴旋转 @(M_PI)
transform.rotation.z 围绕z轴旋转 @(M_PI)
cornerRadius 圆角的设置 @(50)
backgroundColor 背景颜色的变化 (id)[UIColor purpleColor].CGColor
bounds 大小,中心不变
[NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
position 位置(中心点的改变) [NSValue valueWithCGPoint:CGPointMake(300, 300)];
contents 内容,比如UIImageView的图片 imageAnima.toValue = (id)[UIImage imageNamed:@"to"].CGImage;
opacity 透明度 @(0.7)
contentsRect.size.width 横向拉伸缩放 @(0.4)最好是0~1之间的
多谢 方弘毅 写的文章 再写一遍之为加深理解!
原文链接:http://www.jianshu.com/p/02c341c748f9
CGAffineTransform 动画
这种只能进行一次改变,它的改变参照是最初使得imageView
CGAffineTransform t = CGAffineTransformMakeScale(1.5, 1.5);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformMakeTranslation(10, 10);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformMakeRotation(M_PI/4);
self.imageView.transform = t;
这种可以连续改变 每次是以上次改变的结果 为参照
CGAffineTransform t = CGAffineTransformTranslate(self.imageView.transform, 10, 10);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformScale(self.imageView.transform, 0.9, 0.9);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformRotate(self.imageView.transform, M_PI/8);
self.imageView.transform = t;
//清空所有的 效果 回到原来的位置
self.imageView.transform = CGAffineTransformIdentity;