有五個函數
Animating Views with Blocks
+ animateWithDuration:delay:options:animations:completion:
+ animateWithDuration:animations:completion:
+ animateWithDuration:animations:
+ transitionWithView:duration:options:animations:completion:
+ transitionFromView:toView:duration:options:completion:
+ animateWithDuration:delay:options:animations:completion:
+ animateWithDuration:animations:completion:
+ animateWithDuration:animations:
- - (NSInteger)animationOption: (NSInteger)index {
- NSInteger type = 0;
- switch (index) {
- case 0: {// 跟父類作爲一個整體一起動畫,此方式爲默認方式
- type = UIViewAnimationOptionLayoutSubviews;
- break;
- }
- case 1: {// 在動畫運行過程中,允許用戶與之交互操作
- /*
- 注意1,UIViewAnimationOptionAllowUserInteraction只是說允許用戶點擊,但在動畫過程中,
- 比如一個讓btnOne從(0,0)移動到(100,0)的動畫,在動畫播放的過程中其實btnOne的座標已經是(100,0)了 你點擊在view上顯示的btn是沒辦法獲取響應的,你需要在(100,0)處進行點擊才能讓btnOne響應你的點擊事件。
- 解決這個問題的一種方法就是用定時器不斷刷,把動畫微分化:
- - (void)viewDidLoad
- {
- _btnMove = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- [_btnMove addTarget:self action:@selector(btnMoveDidSelect) forControlEvents:UIControlEventTouchUpInside];
- _btnMove.frame = CGRectMake(0, 0, 80, 40);
- [_btnMove setTitle:@"touch me!" forState:UIControlStateNormal];
- [self.view addSubview:_btnMove];
- [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(buttonMoved) userInfo:nil repeats:YES];
- [super viewDidLoad];
- return;
- }
- - (void)buttonMoved
- {
- if(_btnMove.frame.origin.x != 250)
- {
- [UIView beginAnimati*****:nil context:nil];
- [UIView setAnimationDuration:0.01f];
- [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
- [_btnMove setFrame: CGRectMake(_btnMove.frame.origin.x+1, _btnMove.frame.origin.y,_btnMove.frame.size.width, _btnMove.frame.size.height)];
- [UIView commitAnimati*****];
- }
- }
- 注意2:如果你設置了UIViewAnimationOptionAllowUserInteraction,界面上其他的button等控件可以接受事件,但是你不設置UIViewAnimationOptionAllowUserInteraction,其他的控件事件都收不到。也就是說如果設置了UIViewAnimationOptionAllowUserInteraction,在動畫期間,主線程會有時間接受事件。
- */
- type = UIViewAnimationOptionAllowUserInteraction;
- break;
- }
- case 2: {// 從當前狀態開始動畫。例如如下代碼
- /*
- - (void)doAnimation1 {
- [UIView animateWithDuration:5.0
- delay:0.0
- options:nil
- animations:^{
- self.firstView.frame = CGRectMake(0, 0, 200, 200);
- [self performSelector:@selector(doAnimation2) withObject:nil afterDelay:1];
- }
- completion:^(BOOL finished){}];
- }
- - (void)doAnimation2 {
- [UIView animateWithDuration:5.0
- delay:0.0
- options:UIViewAnimationOptionBeginFromCurrentState
- animations:^{
- self.firstView.frame = CGRectMake(660, 660, 200, 200);
- }
- completion:^(BOOL finished){}];
- }
- 當5秒的doAnimation1動畫運行1秒後,開始doAnimation2動畫(doAnimation2設定了UIViewAnimationOptionBeginFromCurrentState參數),則doAnimation2的動畫是從doAnimation1運行到1秒的狀態爲開始狀態繼續運行。如果不傳入這個參數,則doAnimation2的開始狀態爲doAnimation1完整運行結束後的狀態。
- */
- type = UIViewAnimationOptionBeginFromCurrentState;
- break;
- }
- case 3: {// 重複執行一個動畫,從初始狀態到結束狀態,然後瞬間跳到初始狀態繼續無限次的執行同一動作
- type = UIViewAnimationOptionRepeat;
- break;
- }
- case 4: {// 反向執行一個動畫。當動畫執行完一遍後,沿原路徑反向執行一遍。這個屬性必須跟UIViewAnimationOptionRepeat一起使用
- type = UIViewAnimationOptionAutoreverse;
- break;
- }
- case 5: {// 忽略子層嵌套的動畫的時間間隔。例如如下代碼
- /*
- [UIView transitionWithView:self.firstView duration:4.f options:nil animations:^{
- self.firstView.frame = CGRectMake(0, 0, 200, 200);
- [UIView transitionWithView:self.firstView duration:1.f options:nil animations:^{
- self.secondView.frame = CGRectMake(0, 0, 200, 200);
- } completion:^(BOOL finished) {}];
- } completion:^(BOOL finished) {}];
- self.firstView的動畫時間是4秒,self.secondView的動畫時間是1秒,
- 如果子層不設置UIViewAnimationOptionOverrideInheritedDuration(如父層和子層都是nil),
- 則子層默認繼承父層的時間,忽略自己的時間。
- 若是子層設置UIViewAnimationOptionOverrideInheritedDuration屬性,
- 則子層將按照自身設置的1秒的時間執行。
- */
- type = UIViewAnimationOptionOverrideInheritedDuration;
- break;
- }
- case 6: {// 忽略子層嵌套的動畫屬性的時間 (如UIViewAnimationOptionCurveEaseInOut) 同上
- type = UIViewAnimationOptionOverrideInheritedCurve;
- break;
- }
- case 7: {// 允許同一個view的多個動畫同時進行
- type = UIViewAnimationOptionAllowAnimatedContent;
- break;
- }
- case 8: {// 控制兩個subview的顯示和隱藏
- /*
- 控制兩個subview的顯示和隱藏(功能類似於addsubview和removefromsuperview),使用這個屬性(一般在transitionFromView:toView:duration:options:completion:這個方法中使用),FromView會被隱藏,toView會被顯示
- - (void)viedDidLoad{
- [self.secondView removeFromSuperview];
- UIView *containerView = [[UIView alloc] initWithFrame:self.firstView.frame];
- self.firstView.frame = containerView.bounds;
- self.secondView.frame = containerView.bounds;
- [containerView addSubview:self.secondView];
- [containerView addSubview:self.firstView];
- [self.view addSubview:containerView];
- [super viewDidLoad];
- }
- - (void)animation {
- [UIView transitionFromView:self.firstView toView:self.secondView duration:2.f options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews completion:^(BOOL finished) {}];
- }
- */
- type = UIViewAnimationOptionShowHideTransitionViews;
- break;
- }
- // ========= 動畫過渡動作的速度
- case 9: {// 先慢後快再慢
- type = UIViewAnimationOptionCurveEaseInOut;
- break;
- }
- case 10: {// 先慢後快
- type = UIViewAnimationOptionCurveEaseIn;
- break;
- }
- case 11: {// 先快後慢
- type = UIViewAnimationOptionCurveEaseOut;
- break;
- }
- case 12: {// 勻速
- type = UIViewAnimationOptionCurveLinear;
- break;
- }
- // ========= 動畫過渡過程的方式:
- case 13: {// 不指定方式
- type = UIViewAnimationOptionTransitionNone;
- break;
- }
- case 14: {// 翻轉
- type = UIViewAnimationOptionTransitionFlipFromLeft;
- break;
- }
- case 15: {// 翻轉
- type = UIViewAnimationOptionTransitionFlipFromRight;
- break;
- }
- case 16: {// 翻轉
- type = UIViewAnimationOptionTransitionFlipFromTop; // 5.0以後
- break;
- }
- case 17: {// 翻轉
- type = UIViewAnimationOptionTransitionFlipFromBottom;// 5.0以後
- break;
- }
- case 18: {// 重疊,當一個view從一個位置到另一個位置時,當前的view會由透明狀態逐漸顯示到目的位置,原來的位置將會保留一個影子,並逐漸消失
- type = UIViewAnimationOptionTransitionCrossDissolve;// 5.0以後
- break;
- }
- case 19: {// 翻頁
- type = UIViewAnimationOptionTransitionCurlUp;
- break;
- }
- case 20: {// 翻頁
- type = UIViewAnimationOptionTransitionCurlDown;
- break;
- }
- default:
- break;
- }
- return type;
- }