
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)場
- 如何創(chuàng)建一個自定義的
- push && pop 相關(guān)
- 如何創(chuàng)建一個自定義的
push轉(zhuǎn)場 - 如何創(chuàng)建一個自定義的
pop轉(zhuǎn)場 - 如何創(chuàng)建一個自定義的可交互的
pop轉(zhuǎn)場
- 如何創(chuàng)建一個自定義的
如果你想實(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
下圖可能更清晰的描述上文所述

-
首先不管你是通過代碼還是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:391565521email:zhuhaifei_ios@163.com
持續(xù)完善中,敬請期待.......