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

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)建一個自定義的modal轉(zhuǎn)場
    • 如何創(chuàng)建一個自定義的dismiss轉(zhuǎn)場
    • 如何創(chuàng)建一個自定義的可交互的dismiss轉(zhuǎn)場
  • push && pop 相關(guān)
    • 如何創(chuàng)建一個自定義的push轉(zhuǎn)場
    • 如何創(chuàng)建一個自定義的pop轉(zhuǎn)場
    • 如何創(chuàng)建一個自定義的可交互的pop轉(zhuǎn)場

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


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

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

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

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

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

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

該例中具體代碼如下:

#import <UIKit/UIKit.h>

@interface BoncePresentAnimationController : NSObject<UIViewControllerAnimatedTransitioning>

@end

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


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

//2.該方法指定轉(zhuǎn)場動畫的具體實(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.動畫*/
    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)場動畫控制器


#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)建一個實(shí)例,并且進(jìn)行push/pop/modal操作,其運(yùn)行流程一般如下

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

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

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

另附上項目地址

notice

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容