天天看點

自定義NavigationController 的Push 和 Pop過渡動畫

現在開發ios項目有兩種或者可以說三種方式:

(1)純代碼

    純代碼加Xib

(2)storyboard

so,自定義過渡動畫的方式也有兩種,但是動畫的實作都是一樣的。

先說一下過渡動畫的實作方式:一共有三種說白了都是控制View的CATransition動畫。

第一種:

代碼如下:

NKYellowViewController *dst = [[NKYellowViewController alloc]init];

[UIView transitionWithView:self.navigationController.view

                    duration:1

                    options:UIViewAnimationOptionTransitionCrossDissolve

                    animations:^{

                        [self.navigationController pushViewController:dst animated:NO];

                    }

                    completion:nil];

注意:第一個參數為self.navigationController.view

第二種:

代碼如下:

[UIView transitionFromView:self.view toView:dst.view duration:1 options:UIViewAnimationOptionTransitionFlipFromTop completion:^(BOOL finished) {

        [self.navigationController pushViewController:dst animated:NO];

    }];

注意:第一個參數為self.view

第三種:

代碼如下:

CATransition *transition = [CATransition animation];

transition.duration = 1.0f;

transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

transition.type = kCATransitionMoveIn;

transition.subtype = kCATransitionFromTop;

[self.navigationController.view.layer addAnimation:transition forKey:nil];

[self.navigationController pushViewController:dst animated:YES];

動畫的類型有一下幾種,效果自行嘗試

接下來說一下純代碼和storyboard的分别實作

(1)純代碼

如果用代碼實作的話,大部分都是寫在事件處理的函數裡,如一下代碼下載下傳button的事件處理函數裡

push:

- (void)pushViewController:(UIButton *)button

{

    NKYellowViewController *dst = [[NKYellowViewController alloc]init];

    [UIView transitionWithView:self.navigationController.view

                      duration:1

                       options:UIViewAnimationOptionTransitionCrossDissolve

                    animations:^{

                        [self.navigationController pushViewController:dst animated:NO];

                    }

                    completion:nil];

}

pop:

- (void)back {

    [UIView transitionWithView:self.navigationController.view

                      duration:1

                       options:UIViewAnimationOptionTransitionCrossDissolve

                    animations:^{

                         [self.navigationController popViewControllerAnimated:NO];

                    }

                    completion:nil];

}

***動畫代碼可以任意替換,push和pop不對應也可以。

(2)storyboard

界面設計如下:

自定義NavigationController 的Push 和 Pop過渡動畫

具體實作:

自定義segue,繼承于UIStoryBoardSegue并重寫perform方法。

<1>繼承關系

@interface NKSegue : UIStoryboardSegue

<2>重寫方法

- (void)perform

{

    UIViewController *src = self.sourceViewController;

    UIViewController *dst = self.destinationViewController;

    [UIView transitionWithView:src.navigationController.view

                      duration:1

                       options:UIViewAnimationOptionTransitionCrossDissolve

                    animations:^{

                        [src.navigationController pushViewController:dst animated:NO];

                    }

                    completion:nil];

}

<3>設定segue,在右側面闆的屬性檢查器中segue Class設定為自定義的Segue類

自定義NavigationController 的Push 和 Pop過渡動畫

傳回同樣是在傳回函數裡實作動畫代碼就ok了。