iOS学习之动画(storyboard版)

今天给大家分享一篇有关动画的知识, 主要是用storyboard写的😄.
因为没有太多的时间, 我就不给大家详细介绍storyboard的具体用法了(以后有空的话我会专门写一篇有关storyboard的文章), 其实也可以用代码代替的, 只要合理设置控件的坐标就好了.

首先, 我们需要创建一些控件.
先上图吧, 这个是我在Main.storyboard里放置的所有控件, 在图里都有备注.


storyboard里的控件.png

各button都有自己的方法, 我们通过点击不同的button使view产生不同的动画, 比如改变尺寸,背景颜色, 透明度等等. 放置imageView是为了模仿音乐播放时的明星照片旋转动画的效果. 是不是很期待呢?

我们先将Main.storyboard里的控件拖到viewController里成为属性.
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *MusicImageView;
@property (weak, nonatomic) IBOutlet UIView *testView;
@property (nonatomic, assign)BOOL isPlaying;
@end

各个Button的方法也从Main.storyboard里依次拖到viewController里. 各方法的实现内容如下:

尺寸动画按钮的方法:

//修改尺寸:
- (IBAction)didClickedSizeButton:(id)sender
{
[UIView animateWithDuration:2 animations:
^{
self.testView.frame = CGRectMake(120, 120, 50, 50);//可以在completion里继续写动画
} completion:^(BOOL finished) {
[UIView animateWithDuration:1 animations:
^{
self.testView.frame = CGRectMake(0, 0, 50, 50);
} completion:^(BOOL finished) {
}];
}];

}

第一个参数意思是动画的持续时间, 第二个参数的意思是动画的内容, 上边的实现结果是view尺寸改变为(50, 50)后跑到左上角(0, 0)的位置, 还可以继续在completion里继续写动画. 我在一些方法里NSLog了"动画结束". 以此确定动画是否结束.


颜色动画按钮方法:

//修改颜色:
- (IBAction)didClickedColorButton:(id)sender
{
[UIView animateWithDuration:3 animations:^{
    self.testView.backgroundColor = [UIColor greenColor];
} completion:^(BOOL finished) {
    NSLog(@"动画结束");
}];
}

参数的意义不变, 3秒钟后view的背景色变成绿色, 不用动画方法直接一句self.testView.backgroundColor = [UIColor greenColor]只是硬生生的直接绿了, 动画方法有一个渐变的过程.


透明度动画按钮方法:

//修改透明度:
- (IBAction)didClickedAlphaButton:(id)sender
{

[UIView animateWithDuration:3 animations:^{
    self.testView.alpha = 0.3;
} completion:^(BOOL finished) {
    NSLog(@"动画结束");
}];
}

渐渐的就朦胧了, 对于我这个新手来说感觉真的很神奇啊!


那么问题来了, 变化之后该怎么回去呢? 所以我们还需要一个复原按钮, 通过点击它来实现复原的效果.

 //复原:
- (IBAction)didClickedResetButton:(id)sender
{
//    self.testView.frame = CGRectMake(120, 40, 240, 200);
//    self.testView.backgroundColor = [UIColor orangeColor];
//    self.testView.alpha = 1;
[UIView animateWithDuration:3 animations:^{
    self.testView.frame = CGRectMake(120, 40, 240, 200);
    self.testView.backgroundColor = [UIColor orangeColor];
    self.testView.alpha = 1;
} completion:^(BOOL finished)
{
    NSLog(@"动画结束");
}];
}

只要在方法里复原下view的最初属性就可以了.


基本按钮方法:

- (IBAction)didClickedBaseAnimationButton:(id)sender
{
//开始动画(动画的代码必须写在开始和结束之间)
[UIView beginAnimations:@"move" context:nil];
//设置动画的时长:
[UIView setAnimationDuration:2];
//设置代理人:
[UIView setAnimationDelegate:self];//(不用签协议)
//动画代码:
self.testView.backgroundColor = [UIColor greenColor];
//结束动画
[UIView commitAnimations];
}

必要的地方我都在代码里写好备注了, 既然设置了代理人, 那肯定也有它的一些代理方法吧.

//(基本按钮)代理方法:
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
NSLog(@"动画结束!");
}

- (void)animationWillStart:(NSString *)animationID context:(void *)context
{
NSLog(@"动画开始");
}

这个大家看看就行了.


动画位移按钮方法:

- (IBAction)didClickedMoveButton:(id)sender
{
//移动:(不累加)
//    self.testView.transform = CGAffineTransformMakeTranslation(0, 300);//复原后不能移动了
//移动:(累加)
self.testView.transform = CGAffineTransformTranslate(self.testView.transform, 0, 50);
}

这里注释掉的那个方法复原后不能再移动了, 也就是不能累加, 下面那个是可以累加的.


动画缩放按钮方法:

- (IBAction)didClickedScaleButton:(id)sender
{
//缩放:(不累加)
//    self.testView.transform = CGAffineTransformMakeScale(1.5, 1.5);//因为没有参考上一次的方法所以复原后不能使用了
//缩放:(累加):参数为缩放倍数
self.testView.transform = CGAffineTransformScale(self.testView.transform, 1.5, 1.5);
}

同理, 也有累加和不累加两种, 不能累加的原因, 我也只是个菜鸟, 不敢妄下结论, 个人觉得应该是缺了前边的参照.


动画旋转按钮方法:

- (IBAction)didClickedTurnButton:(id)sender
{
self.testView.transform = CGAffineTransformRotate(self.testView.transform, -M_PI_4);
//正数顺时针,负数逆时针转,π/4
}

正负数和方向有关系, PI就是π.


关键帧按钮方法:

- (IBAction)didClickedImportantButton:(id)sender
{
//    spring动画:
//    参数1 : 动画时长
//    参数2 : 延迟的时间
//    参数3 : 弹力系数(0~1)
//    参数4 : 视图移动的速度(<= 200)
//    参数5 : 视图出现的效果
    [UIView animateWithDuration:2 delay:0.0 usingSpringWithDamping:2 initialSpringVelocity:15 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.testView.center = CGPointMake(200, 400);
    } completion:^(BOOL finished) {
        NSLog(@"动画结束!");
    }];

//关键帧动画:
//    [UIView animateKeyframesWithDuration:2 delay:0.0 options:UIViewKeyframeAnimationOptionAutoreverse animations:^{
//        [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0.25 animations:^{
//            self.testView.center = self.view.center;
//            self.testView.backgroundColor = [UIColor yellowColor];
//         }];
//     } completion:^(BOOL finished)
//     {
//         NSLog(@"动画结束!");
//     }];
}

写了两种方法, 大家都可以试试, 第一种方法是有弹性动画的那种, 我个人更喜欢一些.


按钮方法写完了, 还有一个问题, 我们要模仿音乐播放时歌手写真图旋转的效果, 代码都在viewDidLoad里.

//修改边界
self.MusicImageView.layer.cornerRadius = 100;
self.MusicImageView.layer.masksToBounds = YES;//允许修改边界
self.MusicImageView.userInteractionEnabled = YES;
//添加手势
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playPauseAction)];
[self.MusicImageView addGestureRecognizer:tapGesture];

[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(imageTurning) userInfo:nil repeats:YES];
//获取testView的尺寸:
NSLog(@"%@", NSStringFromCGRect(self.testView.frame));

上边添加了一个手势方法和imageTurning(让图片旋转)的方法, 在viewDidLoad外边实现.
#pragma mark -- 暂停播放手势方法:
-(void)playPauseAction
{
self.isPlaying = !_isPlaying;
}

#pragma mark -- 图片旋转一度:
-(void)imageTurning
{
if (_isPlaying == YES)
{
    self.MusicImageView.transform = CGAffineTransformRotate(self.MusicImageView.transform, M_PI / 180);
}
}

这样, 我们的效果就完成了. 暂停的时候点击图片它就停止了转动, 再点一下又会继续"播放".

效果图.png

怎么样, 看着控件这么活泼飘逸, 是不是很有趣呢.
其实我也是刚接触不久, 很多东西都不太明白, 还要向大家多多请教, 以后我会在空闲的时候继续给大家分享一些我所学的一些知识, 希望能和大家一起交流学习, 共同进步!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容