MyZone
先看效果圖(模擬器上interaction-dismiss,因為無法精準的控制Pinch力度,導致效果不佳,真機上運行很流暢)
效果圖.gif
你可以從這篇文章中學到:
- 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)建一個自定義的
如果你想實現(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)場
實現(xiàn)自定義的轉(zhuǎn)場,一般遵循三個步驟
1.首先創(chuàng)建一個專門負責動畫的控制器
animation controller
,此控制器遵循UIViewControllerAnimatedTransitioning protocol
.該控制器負責轉(zhuǎn)場動畫的實現(xiàn).
該例中具體代碼如下:
#import <UIKit/UIKit.h>
@interface BoncePresentAnimationController : NSObject<UIViewControllerAnimatedTransitioning>
@end
實現(xiàn)協(xié)議中兩個非常重要的方法
//1.該方法指定動畫時長
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
//2.該方法指定轉(zhuǎn)場動畫的具體實現(xiàn)
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
結(jié)合到具體實例代碼如下
#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.從當前上下文中獲得相應的狀態(tài)*/
UIViewController * toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController * fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
CGRect finalFrame = [transitionContext finalFrameForViewController:toViewController];
/**2.獲得容器視圖*/
UIView * containerView = [transitionContext containerView];
/**3.設置初始狀態(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出目標控制器之前,指定目標控制器的轉(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)建一個實例,并且進行
push/pop/modal
操作,其運行流程一般如下- 系統(tǒng)框架會首先查看這個目標控制器,其是否設置了轉(zhuǎn)場代理,并遵循相應的協(xié)議.如果沒有,則會使用默認的轉(zhuǎn)場樣式.
如果有,那么系統(tǒng)就會調(diào)用協(xié)議中的方法,返回一個專門的轉(zhuǎn)場控制器,該控制器負責轉(zhuǎn)場時相關(guān)的動畫以及邏輯.如果未返回,依舊使用默認的轉(zhuǎn)場樣式
如果返回了轉(zhuǎn)場控制器,那么就會執(zhí)行
UIViewControllerAnimatedTransitioning
協(xié)議中的方法因為該控制器遵循這個協(xié)議(如圖)
綜上所述,一個簡單的自定義
modal
專場基本實現(xiàn)
另附上項目地址
notice
1.以上代碼僅供參考,如果有任何你覺得不對的地方,都可以聯(lián)系我,我會第一時間回復,謝謝.
qq:391565521
email:zhuhaifei_ios@163.com
持續(xù)完善中,敬請期待.......