《iOS6 application development》学习之路:No.6:两种实现动画的方法

在看iOS6应用开发时,介绍了一种播放动画的效果,其实就是一组数组,里面以此存储了很多张图片,相当于GIF图片的每一帧动画,然后在规定的时间内把他们都播放出来,这样就相当于实现动画了;后来又发现可以用另一种方式实现动画,就是利用Timer,然后再设置一个计数器,根据计数器的不同变化,然后实时改变控件的位置。

直接上代码:

#import "ViewController.h"

@interface ViewController (){
    int _episodeNumber;     //single episode's number
    int _count;             //for the timer;
    int _amountOfEpisode;   //totle number of episodes
    int hammer_hit_number;  //record how many times we have hit the hammer

    //parametors for the episode 2 hammer:
    float finalorigin_y;
    float finalorigin_x;
    int _currentCount;

    NSTimer* timer;
    NSArray* hopAnimation;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    //set the button's style
    [self.goButton.layer setCornerRadius:10.0];
    [self.nextButton.layer setCornerRadius:10.0];

    hopAnimation = @[
                     [UIImage imageNamed:@"final_picture_1.png"],
                     [UIImage imageNamed:@"final_picture_2.png"],
                     [UIImage imageNamed:@"final_picture_3.png"],
                     [UIImage imageNamed:@"final_picture_4.png"],
                     [UIImage imageNamed:@"final_picture_5.png"],
                     [UIImage imageNamed:@"final_picture_6.png"],
                     [UIImage imageNamed:@"final_picture_7.png"],
                     [UIImage imageNamed:@"final_picture_8.png"],
                     [UIImage imageNamed:@"final_picture_9.png"],
                     [UIImage imageNamed:@"final_picture_10.png"],
                     [UIImage imageNamed:@"final_picture_11.png"],
                     [UIImage imageNamed:@"final_picture_12.png"],
                     [UIImage imageNamed:@"final_picture_13.png"],
                     [UIImage imageNamed:@"final_picture_14.png"],
                     [UIImage imageNamed:@"final_picture_15.png"],
                     [UIImage imageNamed:@"final_picture_16.png"],
                     [UIImage imageNamed:@"final_picture_17.png"],
                     [UIImage imageNamed:@"final_picture_18.png"],
                     [UIImage imageNamed:@"final_picture_19.png"],
                     [UIImage imageNamed:@"final_picture_20.png"],
                     ];

    _amountOfEpisode = 3;
//    _episodeNumber = rand()%_amountOfEpisode;
    _episodeNumber = 0;
    self.titleLabel.frame = CGRectMake(40, 27, 240, 60);
    self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
//    self.titleLabel.numberOfLines = 0;
    [self refresh];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)changeState{
    switch (_episodeNumber) {
        case 0:
            if (_count>7) {
                [timer invalidate];
                timer = nil;
//                [self refresh];
            } else {
                _count++;
            }
            switch (_count) {
                case 0:
                    break;
                case 1:
                    [self.gogogo_label setHidden:YES];
                    [self.readyState setHidden:YES];
                    [self.ongoingState setHidden:NO];
                    [self.lala_label setHidden:NO];
                    break;
                case 2:
                    [self.lala_label setHidden:YES];
                    [self.keai_label setHidden:NO];
                    self.ongoingState.frame = CGRectMake(133, 162, 65, 58);
                    break;
                case 3:
                    [self.ongoingState setHidden:YES];
                    [self.keai_label setHidden:YES];
                    [self.finalState setHidden:NO];
                    break;
                default:
                    [self.aoh_label setHidden:NO];
                    if (_count==4) {
                        self.aoh_label.text = @"AH OH!!!";
                    }else if(_count == 5){
                        self.aoh_label.text = @"OH!!!";
                    }else if(_count == 6){
                        self.aoh_label.text = @"H!!!";
                    }else{
                        self.aoh_label.text = @"!!!";
                    }
                    self.aoh_label.frame = CGRectMake(190, 67+(_count-4)*70, 59, 21);
                    self.finalState.frame = CGRectMake(227, 84+(_count-4)*70, 68, 58);
                    break;
            }
            break;

        case 1://rotate
            if (_count>6) {
                [timer invalidate];
                timer = nil;
//                [self refresh];
                [self.rotateView stopAnimating];
                self.finalState.frame = CGRectMake(227, 351, 68, 58);
                [self.finalState setHidden:NO];
            } else {
                _count++;
                switch (_count) {
                    case 0:
                        break;
                    case 1:
                        [self.gogogo_label setHidden:YES];
                        [self.readyState setHidden:YES];
                        [self.ongoingState setHidden:NO];
                        [self.lala_label setHidden:NO];
                        break;
                    case 2:
                        [self.lala_label setHidden:YES];
                        [self.keai_label setHidden:NO];
                        self.ongoingState.frame = CGRectMake(133, 162, 65, 58);
                        break;
                    case 3:
                        [self.ongoingState setHidden:YES];
                        [self.keai_label setHidden:YES];
                        [self.finalState setHidden:NO];
                        break;
                    case 4:
                        [self.finalState setHidden:YES];
                        [self.aoh_label setHidden:NO];
                        [self.rotateView setHidden:NO];
                        [self.rotateView startAnimating];
                        break;
                    default:
                        if (_count ==  6) {
                            self.rotateView.frame = CGRectMake(227, 74+167.5, 68, 167.5);
                        }
                        break;
                    }
            }
            break;

        case 2://hammer
            if (_count>500) {
                [timer invalidate];
                timer = nil;
                [self refresh];
            } else {
            _count++;
            [self.readyState setHidden:YES];
            [self.ongoingState setHidden:NO];

            if (hammer_hit_number<20&&hammer_hit_number>=0) {
                self.ongoingState.frame = CGRectMake(10+_count, 351-_count, 65, 58);
                self.hammerButton.frame = CGRectMake(40+_count, 330-_count, 80, 60);
                self.gogogo_label.frame = CGRectMake(-50+_count, 320-_count, 100, 40);
                if (hammer_hit_number < 3&&hammer_hit_number>=1) {
                    self.gogogo_label.text = @"啊!好疼!";
                } else if (hammer_hit_number<5&&hammer_hit_number>=3) {
                    self.gogogo_label.text = @"还行,能抗住";
                } else if(hammer_hit_number<10&&hammer_hit_number>=5){
                    self.gogogo_label.text = @"快扛不住了。。。";
                } else if(hammer_hit_number>=10&&hammer_hit_number<20){
                    self.gogogo_label.text = @"你干嘛总是敲我";
                }
            }else if(hammer_hit_number==20) {
                _currentCount = _count;
                self.gogogo_label.text = @"我。。不。。行。。了";
                finalorigin_y = self.ongoingState.frame.origin.y;
                finalorigin_x = self.ongoingState.frame.origin.x;
                NSLog(@"x:%1.2f,y:%1.2f",finalorigin_x,finalorigin_y );
            }else {
                if (hammer_hit_number>25) {
                    self.gogogo_label.text = @"你是不是有瘾!!!!";
                }else{
                    self.gogogo_label.text = @"都不行了还敲!";
                }
                self.ongoingState.frame = CGRectMake(finalorigin_x, finalorigin_y+(_count-_currentCount), 65, 58);
                NSLog(@"button_X:%1.2f, button_Y:%1.2f",self.ongoingState.frame.origin.x,self.ongoingState.frame.origin.y);
                self.gogogo_label.frame = CGRectMake(finalorigin_x-70, finalorigin_y+(_count-_currentCount)-30, 100, 40);
                self.hammerButton.frame = CGRectMake(finalorigin_x+30, finalorigin_y+(_count-_currentCount)-20, 80, 60);
            }
            if (self.ongoingState.frame.origin.y>350) {
                [timer invalidate];
                timer = nil;
                }
            }
            break;
        default:
            break;
    }
}

- (IBAction)go:(id)sender {
    [self refresh];
    switch (_episodeNumber) {
        case 0:
            if ([self.goButton.titleLabel.text isEqualToString:@"Go"]) {
                if (_count == 0) {
                    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(changeState) userInfo:nil repeats:YES];
                    [self.gogogo_label setHidden:NO];
                }
            } else {
                [self.goButton setTitle:@"Go" forState:UIControlStateNormal];
                [timer invalidate];
                _count = 0;
                timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(changeState) userInfo:nil repeats:YES];
            }
            break;

        case 1:
            timer = [NSTimer scheduledTimerWithTimeInterval:1.01 target:self selector:@selector(changeState) userInfo:nil repeats:YES];
            [self.gogogo_label setHidden:NO];
            break;

        case 2:
            timer = [NSTimer scheduledTimerWithTimeInterval:0.06 target:self selector:@selector(changeState) userInfo:nil repeats:YES];
            [self.gogogo_label setHidden:NO];
            break;

        default:
            break;
    }
}

3中场景,case0中是利用timer根据_count的数值变化,实时改变按钮的形态,从而实现动态效果。

case1其实就是类似于播放GIF图片一样,实现PS了20张图片,连续播放就是一组GIF图片了,然后事前在animation数组中将其存储好,然后利用下面的函数

self.rotateView.animationImages = hopAnimation;
            self.rotateView.animationDuration = 2;

设置动画播放的间隔,这里我们设定2秒之内播放完20帧图片。如果不设置,默认是每秒30帧图片。

case2就相对复杂一点了,涉及到了用户交互,根据用户点击按钮的次数,改变另一个按钮的运行轨迹。但是总的来说,和case0的思路是一样的,只不过逻辑关系要复杂一点,但总的来说依旧不难。

时间: 2024-10-29 04:13:59

《iOS6 application development》学习之路:No.6:两种实现动画的方法的相关文章

《iOS6 application development》学习之路:No.1

虽然开始学习iOS的开发是在XCode5.1之后,而且默认的部署环境也都是iOS7的了,但是舍不得越狱的我的小4,况且也带不动iOS7,不过还好找到了可以把程序部署到我的iOS6系统上的方法http://blog.csdn.net/u011156012/article/details/30543471 入手<iOS6 Application Development>这本书已经1周了,感觉看起来很舒服,从简单到复杂,循序渐进,不断深入学习iOS开发的种种.今天进入到第11章:实现多场景和弹出框.

《iOS6 application development》学习之路:No.2

开始之前先说几个关键字吧  @property中的weak, nonatomic 和strong weak告诉系统,补在使用引用对象时,可将其从内存中删去.nonatomic告诉系统,不用担心应用程序的不同部分同时使用该属性的问题.几乎在任何情况下,都将使用这两个特性. 但是有时候需要使用特性 strong代替weak. weak能让Xcode更高效地将对象从内存中清除.还能避免所谓的循环引用(circular reference),即由于以下的原因,不能把对象从内存中清除:它引用了一个另一个对

Javascript学习总结:Js继承的两种方式

文章简介:总结就是利用对象冒充机制的call方法把父类的属性给抓取下来,而成员方法尽量写进被所有对象实例共享的prototype域中,以防止方法副本重复创建.然后子类继承父类prototype域来抓取下来所有的方法.如想彻底理清这些调用链的关系,推荐大家多关注Js中prototype的constru 一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来

《iOS6 application development》学习之路:No.3: 自定义选择器

先看下程序跑起来的样子吧,没有做任何,任何界面上的优化,所以请忽视丑陋的页面. 总共就两个,第一个页面是inital页面,中间一个label用来显示用户做的不同选择,下方是一个放在tool bar里面的button,用户点击后可以进行两个页面的切换.第2个页面总共有3个空间,最上端是一个自定义的pick view,两列,第一列显示动物的图片,第二列显示动物的叫声.中间是一个label,最下端是一个按钮,点击按钮后用来返回上一个页面. 因为教材中是按照功能拆分了一块一块讲解的,所以这次分别把2个页

《iOS6 application development》学习之路:No.5: __bridge,NSTimer和圆角

关于__bridge,第一次碰到类型转换的时候,没有注意到前面是两个_的.废话不多说,进入正题: 由于ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之间,我们需要使用到__bridge,__bridge_retained和__bridge_transfer三个转换关键字. 根据苹果官方的文档(https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-T

iOS6中ARC 下两种释放对象的方法

  使用了 ARC 之后,无疑大大减少了程序员进行内存管理的压力.你再也不用写 release/autorelease 代码了,再也不用写dealloc 方法了.但这不等于程序员不需要内存管理.例如,你需要在 viewDidUnload 方法中对对象进行释放,以防当内存警告发生时,你没有内存可以回收.当然ARC 托管对象的释放方式与 MRC 是不同的.对于 ARC 托管对象,你必须用 ARC 特有的两种释放方式: [self setOjbect:nil]; 或者: self.object=nil

Android学习笔记(36):Android的两种事件处理方式

Android提供了两种事件处理的方式:基于回调的事件处理 和 基于监听的事件处理.   我们来说的容易理解一点: (1)基于回调的事件处理就是继承GUI组件,并重写该组件的事件处理方法.除了一些特定的情况,大部分情况使用基于回调的事件处理方式并不是最好的选择. (2)基于监听的事件处理就是在监听器中定义事件的处理方式,再为组件绑定监听器.这种方式无疑是更能够体现面向对象思想的.   基于回调的事件处理:   View类包含如下的方法可以用于重写: boolean onKeyDown(int k

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

Webwork 学习之路(六)Action 调用

阅读目录 1.这部分框架类关系 2.Webwork 获取和包装 web 参数 3.DefaultActionProxyFactory.DefaultActionProxy.DefaultActionInvocation       一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork 框架流转图中红色框的地方. 回到顶部 1.这部分框架类关系 回到顶部