閱讀861 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《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的思路是一樣的,隻不過邏輯關係要複雜一點,但總的來說依舊不難。

最後更新:2017-04-03 05:38:58

  上一篇:go py 控製台標準輸入輸出
  下一篇:go obj-c編程15[Cocoa實例03]:MVC以及歸檔化示例