iOS開發(fā)-定制屬于你自己的酷炫轉(zhuǎn)場動(dòng)畫

i fought,but i lost,then i rest

MyZone


先看效果圖(模擬器上interaction-dismiss,因?yàn)闊o法精準(zhǔn)的控制Pinch力度,導(dǎo)致效果不佳,真機(jī)上運(yùn)行很流暢)

效果圖.gif

你可以從這篇文章中學(xué)到:

  • modal相關(guān)
    • 如何創(chuàng)建一個(gè)自定義的modal轉(zhuǎn)場
    • 如何創(chuàng)建一個(gè)自定義的dismiss轉(zhuǎn)場
    • 如何創(chuàng)建一個(gè)自定義的可交互的dismiss轉(zhuǎn)場
  • push && pop 相關(guān)
    • 如何創(chuàng)建一個(gè)自定義的push轉(zhuǎn)場
    • 如何創(chuàng)建一個(gè)自定義的pop轉(zhuǎn)場
    • 如何創(chuàng)建一個(gè)自定義的可交互的pop轉(zhuǎn)場

如果你想實(shí)現(xiàn)更多的轉(zhuǎn)場效果,可以深入研究下facebook 的 pop開源框架,大有裨益


項(xiàng)目目錄結(jié)構(gòu)如下-轉(zhuǎn)場相關(guān):

轉(zhuǎn)場相關(guān)的類.png

限于篇幅的緣故,這里著重介紹下如何自定義一個(gè)modal的轉(zhuǎn)場

創(chuàng)建一個(gè)自定義的modal轉(zhuǎn)場

實(shí)現(xiàn)自定義的轉(zhuǎn)場,一般遵循三個(gè)步驟

1.首先創(chuàng)建一個(gè)專門負(fù)責(zé)動(dòng)畫的控制器 animation controller,此控制器遵循UIViewControllerAnimatedTransitioning protocol.該控制器負(fù)責(zé)轉(zhuǎn)場動(dòng)畫的實(shí)現(xiàn).

該例中具體代碼如下:

#import <UIKit/UIKit.h>

@interface BoncePresentAnimationController : NSObject<UIViewControllerAnimatedTransitioning>

@end

實(shí)現(xiàn)協(xié)議中兩個(gè)非常重要的方法


//1.該方法指定動(dòng)畫時(shí)長
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext

//2.該方法指定轉(zhuǎn)場動(dòng)畫的具體實(shí)現(xiàn)
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext

結(jié)合到具體實(shí)例代碼如下

#import "BoncePresentAnimationController.h"

@implementation BoncePresentAnimationController



// This method specifies the length of the transition animation.
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
    
    return  0.5;
    
}

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    
    
    /**1.從當(dāng)前上下文中獲得相應(yīng)的狀態(tài)*/
    
    UIViewController * toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    
    UIViewController * fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    
    
    
    CGRect finalFrame = [transitionContext finalFrameForViewController:toViewController];
    
    /**2.獲得容器視圖*/
    UIView * containerView = [transitionContext containerView];
 
    
    /**3.設(shè)置初始狀態(tài)*/
    
    CGRect screenBounds = [UIScreen mainScreen].bounds;
    
    toViewController.view.frame = CGRectOffset(screenBounds, 0, screenBounds.size.height);
    
    
    /**4.添加視圖*/
    
    [containerView addSubview:toViewController.view];
    
    /**5.動(dòng)畫*/
    NSTimeInterval  duration = [self transitionDuration:transitionContext];
    
    
    [UIView animateWithDuration:duration delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
       
        fromViewController.view.alpha = 0.5;
        
        toViewController.view.frame = finalFrame;
        
    } completion:^(BOOL finished) {
        
        fromViewController.view.alpha = 1;
        
        // Inform the transition context when the animation completes. The framework then ensures the final state is consistent and removes the from- view from the container.
        [transitionContext completeTransition:YES];
        
    }];
    
}

2.在modal出目標(biāo)控制器之前,指定目標(biāo)控制器的轉(zhuǎn)場代理,并且遵循UIViewControllerTransitioningDelegate協(xié)議

本例中代碼如下

if ([segue.identifier isEqualToString:@"showAbout"]) {
        
        UIViewController * toViewController = segue.destinationViewController;
        
        [_pinchInteractionController wireToViewController:toViewController];
        
        toViewController.transitioningDelegate = self;
        
    }
   

3.在代理方法中,返回轉(zhuǎn)場動(dòng)畫控制器


#pragma mark - UIViewControllerTransitioningDelegate(Modal相關(guān))

-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    
    //1.this method simply returns your custom animation controller instance. If you had multiple view controllers wired up, you could also check the view controller presented to switch between different custom animations.
    return _bouncePresentAnimationController;
    
}

notice

下圖可能更清晰的描述上文所述

流程 2016-06-28 上午12.41.26.png
  • 首先不管你是通過代碼還是StoryBoard來創(chuàng)建一個(gè)實(shí)例,并且進(jìn)行push/pop/modal操作,其運(yùn)行流程一般如下

    • 系統(tǒng)框架會(huì)首先查看這個(gè)目標(biāo)控制器,其是否設(shè)置了轉(zhuǎn)場代理,并遵循相應(yīng)的協(xié)議.如果沒有,則會(huì)使用默認(rèn)的轉(zhuǎn)場樣式.
  • 如果有,那么系統(tǒng)就會(huì)調(diào)用協(xié)議中的方法,返回一個(gè)專門的轉(zhuǎn)場控制器,該控制器負(fù)責(zé)轉(zhuǎn)場時(shí)相關(guān)的動(dòng)畫以及邏輯.如果未返回,依舊使用默認(rèn)的轉(zhuǎn)場樣式

  • 如果返回了轉(zhuǎn)場控制器,那么就會(huì)執(zhí)行UIViewControllerAnimatedTransitioning協(xié)議中的方法因?yàn)樵摽刂破髯裱@個(gè)協(xié)議(如圖)

綜上所述,一個(gè)簡單的自定義modal專場基本實(shí)現(xiàn)

另附上項(xiàng)目地址

notice

1.以上代碼僅供參考,如果有任何你覺得不對(duì)的地方,都可以聯(lián)系我,我會(huì)第一時(shí)間回復(fù),謝謝.
qq:391565521 email:zhuhaifei_ios@163.com

持續(xù)完善中,敬請(qǐng)期待.......

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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