iOS开发学习之简单动画
- UIActivityIndicatorView
- UIImageView的序列帧动画
- UIView动画
- 时钟动画
一、UIActivityIndicatorView
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 使用了SVProgress的maskType属性,当前视图无法接受触摸事件 // 需要想办法关闭 // 使用NSTimer if ([_indicatorView isAnimating]) { [SVProgressHUD dismiss]; [_indicatorView stopAnimating]; } else { [SVProgressHUD showWithStatus:@"等会~~~" maskType:SVProgressHUDMaskTypeGradient]; // 指示器一启动,就无法交互了,要把时钟放在这里 [_indicatorView startAnimating]; [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:NO]; } } // NSTimer调用方法的参数,只能是NSTimer,使用参数,在当前示例中,就不需要使用成员变量了 - (void)updateTimer:(NSTimer *)timer { [SVProgressHUD dismiss]; [_indicatorView stopAnimating]; // 关闭时钟 [timer invalidate]; }
二、UIImageView的序列帧动画
// 创建赵云的序列帧动画 - (void)createZhaoyunImage { // Do any additional setup after loading the view, typically from a nib. // 设置ImageView的序列帧动画 // 1. 需要一个数组 NSMutableArray *images = [NSMutableArray array]; for (int i = 1; i < 11; i++) { NSString *fileName = [NSString stringWithFormat:@"/images/zy/%d.png", i]; UIImage *image = [UIImage imageNamed:fileName]; [images addObject:image]; } [_zhaoyunImage setImage:images[0]]; // 设置图像数组 [_zhaoyunImage setAnimationImages:images]; // 设置10张图片播放的时长 [_zhaoyunImage setAnimationDuration:1.0f]; // 开始动画 [_zhaoyunImage startAnimating]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if ([_zhaoyunImage isAnimating]) { // 序列帧动画每次停止的时候,都会显示设置的图像,而不是当前播放到的图像 [_zhaoyunImage stopAnimating]; } else { [_zhaoyunImage startAnimating]; } }
2.燕子动画
#pragma mark - 拖拽燕子 - (void)dragBird:(UIPanGestureRecognizer *)sender { // 先需要知道手指的位置 CGPoint location = [sender locationInView:self.view]; // 手势状态改是UIGestureRecognizerStateChanged的时候,手指还没有离开屏幕 // 这个时候,可以修改鸟的位置,同时让鸟扑腾 if (sender.state == UIGestureRecognizerStateChanged) { // 注意:如果要修改播放中的序列帧动画 // 1. 需要先停止动画 [_birdImage stopAnimating]; // 2. 修改动画频率 [_birdImage setAnimationDuration:0.2f]; // 3. 重新启动动画 [_birdImage startAnimating]; // 修改燕子的动画频率 // 设置燕子的位置 [_birdImage setCenter:location]; } else if (sender.state == UIGestureRecognizerStateEnded) { // 恢复燕子慢悠悠 // 1. 需要先停止动画 [_birdImage stopAnimating]; // 2. 修改动画频率 [_birdImage setAnimationDuration:1.2f]; // 3. 重新启动动画 [_birdImage startAnimating]; } } // 设置燕子的序列帧动画,并设置燕子的拖拽手势监听 - (void)createBirdImage { // 设置燕子的序列帧动画 NSArray *images = @[[UIImage imageNamed:@"/images/素材/燕子1.png"], [UIImage imageNamed:@"/images/素材/燕子2.png"]]; [_birdImage setAnimationImages:images]; [_birdImage setAnimationDuration:1.2f]; [_birdImage startAnimating]; // 定义手势 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(dragBird:)]; [_birdImage addGestureRecognizer:pan]; // 设置燕子图片允许用户交互 [_birdImage setUserInteractionEnabled:YES]; }
三、UIView动画
四、时钟动画(CADisplayLink)
@interface ViewController () { // 游戏时钟 CADisplayLink *_gameTimer; // 时钟触发的初始时间 CFTimeInterval _startTime; } @end @implementation ViewController #pragma mark - 使用指定时间处理CADisplayLink触发时间的方法(1) - (void)updateTimer:(CADisplayLink *)sender { // 如果_startTime=0,说明是第一次触发时钟,需要记录时钟的时钟戳记 if (_startTime == 0) { _startTime = sender.timestamp; } // 时钟触发的时间差值 CFTimeInterval deltaTime = sender.timestamp - _startTime; if (deltaTime > 1.0) { NSLog(@"时钟触发了 %f", sender.timestamp); // 更新_startTime的数值,记录本次执行任务的时间 _startTime = sender.timestamp; } } #pragma mark - 使用指定时间处理CADisplayLink触发时间的方法(2) - (void)step { // 假定每隔一秒触发一次方法 if (steps % (10 * 60 * 60) == 1) { NSLog(@"时钟触发了! %ld", steps); } steps++; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 首先将启动的时间点设置为0 _startTime = 0.0f; // 将屏幕刷新总次数设置为0 steps = 0; // 初始化游戏时钟 _gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)]; // 初始化时钟之后,有一个必须要做的,就是把游戏时钟,添加到主运行循环 [_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; }
steps = 0; // 初始化雪花图像 _snowImage = [UIImage imageNamed:@"/images/素材/雪花"]; // 初始化时钟 _gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)]; [_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
#pragma mark - 时钟处理方法 - (void)step { // 假设每秒钟绘制6个雪花 if (steps % 10 == 0) { // 绘制雪花 UIImageView *imageView = [[UIImageView alloc]initWithImage:_snowImage]; // 指定雪花出现的位置 CGPoint startPoint = CGPointMake(arc4random() % 320, -30.0); // 指定雪花结束的位置 CGPoint endPoint = CGPointMake(arc4random() % 320, 490); /** 新问题 1. 雪花太大 2. 雪花太亮,需要改一下透明度 3. 如果雪花会转就更好了 */ CGFloat r = arc4random() % 5 + 10; [imageView setFrame:CGRectMake(0, 0, r, r)]; // 设置起始点 [imageView setCenter:startPoint]; // 把雪花图像添加到视图 [self.view addSubview:imageView]; [UIView animateWithDuration:6.0f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{ [imageView setCenter:endPoint]; [imageView setAlpha:0.2f]; [imageView setTransform:CGAffineTransformMakeRotation(M_PI)]; } completion:^(BOOL finished) { // 从父视图删除,这个千万不要忘了 [imageView removeFromSuperview]; }]; } }
转载请注明:http://www.cnblogs.com/letougaozao/p/3673927.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。