iOS自定義Navgation的push和pop動畫(boss直聘首頁)

前兩天阔拳,寫了一篇關于切換圖片推拉效果的文章崭孤,在總結的時候發(fā)現(xiàn)還有一點沒有提到,就是當頁面跳轉時候的動畫糊肠,很多APP現(xiàn)在不滿足于系統(tǒng)自帶的效果辨宠,所以要重寫動畫,上篇中著重提到更靈活的使用scrollView货裹,和一般動畫比例的用法彭羹。而這篇著重說下如何重寫系統(tǒng)動畫。老規(guī)矩泪酱,先上圖:

效果.gif

相信有不少人都用過boss直聘,當然还最,我也是突然來靈感砌左,就用這個效果粘衬。
首先,需要一個collectionView。初始化康聂,并吧cell封裝出來,便于復用時的控制(這里由于資源有限胖翰,cell內(nèi)容就不變了荧缘,如果想改變,可以把內(nèi)容傳進來枣氧,在set方法里改變本cell的內(nèi)容)

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(kScreenSize.width - 20, 155);
layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);
layout.minimumLineSpacing = 10;
_collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 64, kScreenSize.width, kScreenSize.height - 64) collectionViewLayout:layout];
_collectionView.delegate = self;
_collectionView.dataSource = self;
[_collectionView registerClass:[CoustomCollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
_collectionView.backgroundColor = [UIColor groupTableViewBackgroundColor];
[self.view addSubview:_collectionView];

接下來溢十,封裝cell,在這里就不在上代碼了达吞,并給cell添加跳轉事件张弛。
封裝cell之后,才是重頭戲。
首先我們需要知道UIViewControllerAnimatedTransitioning協(xié)議吞鸭,這個協(xié)議的實現(xiàn)就是負責切換的具體內(nèi)容寺董,當然可以理解為“在切換中發(fā)生了什么”。在這個協(xié)議里面有兩個方法:

  • -(NSTimeInterval)transitionDuration: transitionContext:
  • -(void)animateTransition: transitionContext
    第一個方法即為跳轉的時間刻剥,便是navgationBar變化的時間遮咖,第二個方法便是所要執(zhí)行的動畫,在這里造虏,有一個泛型為UIViewControllerContextTransitioning對象御吞,第二個方法里,傳入的參數(shù)只有這一個酗电,可想而知魄藕,跳轉過程中的所有東西,可能都是這一個對象控制的撵术。
    通過API可知背率,在這個對象里,有from的頁面和to的頁面嫩与,還有控制頁面的對象寝姿,這樣,我們就好辦了划滋,通過這個對象饵筑,添加動畫效果即可,如果是老手处坪,不必多說根资,但是,對于新手同窘,我們就必須講一下這個對象中的containerView玄帕。
    containerView便是控制整個跳轉的頁面,便是我們在跳轉中和跳轉后所顯示的內(nèi)容頁想邦。官方文檔是這樣描述的:“這個視圖即是動畫發(fā)生的地方”裤纹,沒錯,通俗易懂丧没,跳轉視圖鹰椒,這個視圖是必須控制好的。
    下面就上代碼:
-(void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{
    //獲取到containerView視圖
    UIView *containerView = [transitionContext containerView];
    //獲取到目的視圖(同樣可以獲取目的控制器和根源控制器)
    UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
    //獲取到根源視圖
    UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
    UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, kScreenSize.width, kScreenSize.height-64)];
    backView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0];
    UIView *sizeView = [[UIView alloc] initWithFrame:_frame];
    sizeView.backgroundColor = [UIColor whiteColor];
//    _isGO為變量呕童,判斷用戶使用的是push還是pop
//    動畫處理
    if (_isGo) {
        [containerView addSubview:backView];
        [containerView addSubview:sizeView];
        [UIView animateWithDuration:0.3 animations:^{
            fromView.transform = CGAffineTransformScale(fromView.transform, 0.9, 0.9);
            backView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.5 animations:^{
                sizeView.frame = CGRectMake(0, 64, kScreenSize.width, kScreenSize.height);
            } completion:^(BOOL finished) {
                [backView removeFromSuperview];
                [sizeView removeFromSuperview];
                toView.frame = CGRectMake(0, 0, kScreenSize.width, kScreenSize.height);
                [containerView addSubview:toView];
                [transitionContext completeTransition:YES];
            }];
        }];
    }else{
        [containerView insertSubview:toView belowSubview:fromView];
        backView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
        [containerView insertSubview:backView belowSubview:fromView];
        [UIView animateWithDuration:0.5 animations:^{
            fromView.frame = CGRectMake(0, -kScreenSize.height, kScreenSize.width, kScreenSize.height);
        }completion:^(BOOL finished) {
            [backView removeFromSuperview];
            [UIView animateWithDuration:0.3 animations:^{
                toView.transform = CGAffineTransformMakeScale(1, 1);
            } completion:^(BOOL finished) {
                [transitionContext completeTransition:YES];
            }];
        }];
    }

動畫寫完了漆际,跳轉問題也了,如何讓跳轉時走此方法夺饲,這就涉及到nav的代理了灿椅,代理中有這個方法:
-(nullable id <UIViewControllerAnimatedTransitioning>)navigationController: animationControllerForOperation: fromViewController:toViewController:
這個方法返回的就是動畫套蒂,即我們剛剛實現(xiàn)的實現(xiàn)協(xié)議的類。

-(nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                            animationControllerForOperation:(UINavigationControllerOperation)operation
                                                         fromViewController:(UIViewController *)fromVC
                                                           toViewController:(UIViewController *)toVC{
    if (operation == UINavigationControllerOperationPush) {
        _animation.isGo = YES;
    }else{
        _animation.isGo = NO;
    }
    return _animation;
}

這就是完成了自定義跳轉動畫
當然茫蛹,還有人會用到presentViewCotroller操刀,presentViewController動畫實現(xiàn)都一樣,當時代理時需要UIViewControllerTransitioningDelegate協(xié)議調(diào)用secondVC.transitioningDelegate = self婴洼;
代理中有兩個方法骨坑,一個是跳轉,還有一個是退回
-(id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:
-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:presentingController:sourceController:
同樣返回自定義動畫類即可

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柬采,一起剝皮案震驚了整個濱河市欢唾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粉捻,老刑警劉巖礁遣,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肩刃,居然都是意外死亡祟霍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門盈包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沸呐,“玉大人,你說我怎么就攤上這事呢燥≌柑恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵叛氨,是天一觀的道長呼渣。 經(jīng)常有香客問我,道長寞埠,這世上最難降的妖魔是什么徙邻? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮畸裳,結果婚禮上,老公的妹妹穿的比我還像新娘淳地。我一直安慰自己怖糊,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布颇象。 她就那樣靜靜地躺著伍伤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遣钳。 梳的紋絲不亂的頭發(fā)上扰魂,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音,去河邊找鬼劝评。 笑死姐直,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蒋畜。 我是一名探鬼主播声畏,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姻成!你這毒婦竟也來了插龄?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤科展,失蹤者是張志新(化名)和其女友劉穎均牢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體才睹,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡徘跪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砂竖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片真椿。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乎澄,靈堂內(nèi)的尸體忽然破棺而出突硝,到底是詐尸還是另有隱情,我是刑警寧澤置济,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布解恰,位于F島的核電站,受9級特大地震影響浙于,放射性物質發(fā)生泄漏护盈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一羞酗、第九天 我趴在偏房一處隱蔽的房頂上張望腐宋。 院中可真熱鬧,春花似錦檀轨、人聲如沸胸竞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卫枝。三九已至,卻和暖如春讹挎,著一層夾襖步出監(jiān)牢的瞬間校赤,已是汗流浹背吆玖。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留马篮,地道東北人沾乘。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像积蔚,于是被迫代替她去往敵國和親意鲸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容