MyZone
先看效果圖(模擬器上interaction-dismiss,因?yàn)闊o(wú)法精準(zhǔn)的控制Pinch力度,導(dǎo)致效果不佳,真機(jī)上運(yùn)行很流暢)
你可以從這篇文章中學(xué)到:
- modal相關(guān)
- 如何創(chuàng)建一個(gè)自定義的
modal
轉(zhuǎn)場(chǎng) - 如何創(chuàng)建一個(gè)自定義的
dismiss
轉(zhuǎn)場(chǎng) - 如何創(chuàng)建一個(gè)自定義的可交互的
dismiss
轉(zhuǎn)場(chǎng)
- 如何創(chuàng)建一個(gè)自定義的
- push && pop 相關(guān)
- 如何創(chuàng)建一個(gè)自定義的
push
轉(zhuǎn)場(chǎng) - 如何創(chuàng)建一個(gè)自定義的
pop
轉(zhuǎn)場(chǎng) - 如何創(chuàng)建一個(gè)自定義的可交互的
pop
轉(zhuǎn)場(chǎng)
- 如何創(chuàng)建一個(gè)自定義的
如果你想實(shí)現(xiàn)更多的轉(zhuǎn)場(chǎng)效果,可以深入研究下facebook 的 pop開(kāi)源框架,大有裨益
項(xiàng)目目錄結(jié)構(gòu)如下-轉(zhuǎn)場(chǎng)相關(guān):
限于篇幅的緣故,這里著重介紹下如何自定義一個(gè)modal
的轉(zhuǎn)場(chǎng)
創(chuàng)建一個(gè)自定義的modal
轉(zhuǎn)場(chǎng)
實(shí)現(xiàn)自定義的轉(zhuǎn)場(chǎng),一般遵循三個(gè)步驟
1.首先創(chuàng)建一個(gè)專(zhuān)門(mén)負(fù)責(zé)動(dòng)畫(huà)的控制器
animation controller
点待,此控制器遵循UIViewControllerAnimatedTransitioning protocol
.該控制器負(fù)責(zé)轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的實(shí)現(xiàn).
該例中具體代碼如下:
#import <UIKit/UIKit.h>
@interface BoncePresentAnimationController : NSObject<UIViewControllerAnimatedTransitioning>
@end
實(shí)現(xiàn)協(xié)議中兩個(gè)非常重要的方法
//1.該方法指定動(dòng)畫(huà)時(shí)長(zhǎng)
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
//2.該方法指定轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的具體實(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)畫(huà)*/
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)場(chǎng)代理诱咏,并且遵循
UIViewControllerTransitioningDelegate
協(xié)議
本例中代碼如下
if ([segue.identifier isEqualToString:@"showAbout"]) {
UIViewController * toViewController = segue.destinationViewController;
[_pinchInteractionController wireToViewController:toViewController];
toViewController.transitioningDelegate = self;
}
3.在代理方法中琼讽,返回轉(zhuǎn)場(chǎng)動(dòng)畫(huà)控制器
#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
下圖可能更清晰的描述上文所述
-
首先不管你是通過(guò)代碼還是StoryBoard來(lái)創(chuàng)建一個(gè)實(shí)例,并且進(jìn)行
push/pop/modal
操作允蜈,其運(yùn)行流程一般如下- 系統(tǒng)框架會(huì)首先查看這個(gè)目標(biāo)控制器,其是否設(shè)置了轉(zhuǎn)場(chǎng)代理,并遵循相應(yīng)的協(xié)議.如果沒(méi)有,則會(huì)使用默認(rèn)的轉(zhuǎn)場(chǎng)樣式.
如果有,那么系統(tǒng)就會(huì)調(diào)用協(xié)議中的方法巍糯,返回一個(gè)專(zhuān)門(mén)的轉(zhuǎn)場(chǎng)控制器,該控制器負(fù)責(zé)轉(zhuǎn)場(chǎng)時(shí)相關(guān)的動(dòng)畫(huà)以及邏輯.如果未返回,依舊使用默認(rèn)的轉(zhuǎn)場(chǎng)樣式
如果返回了轉(zhuǎn)場(chǎng)控制器,那么就會(huì)執(zhí)行
UIViewControllerAnimatedTransitioning
協(xié)議中的方法因?yàn)樵摽刂破髯裱@個(gè)協(xié)議(如圖)
綜上所述齿穗,一個(gè)簡(jiǎn)單的自定義
modal
專(zhuān)場(chǎng)基本實(shí)現(xiàn)
另附上項(xiàng)目地址
notice
1.以上代碼僅供參考,如果有任何你覺(jué)得不對(duì)的地方,都可以聯(lián)系我,我會(huì)第一時(shí)間回復(fù)喊括,謝謝.
qq:391565521
email:zhuhaifei_ios@163.com
持續(xù)完善中,敬請(qǐng)期待.......