《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