標籤:代碼 mst 設定 ace rac time sele oms int
#import <objc/runtime.h>
@interface UINavigationController (Transition)<UIGestureRecognizerDelegate>
- (void)transitionPanGestureDidLoad;
@end
@interface DLNavigationTransition ()
@end
@implementation DLNavigationTransition
/**
* 啟動右滑pop
*/
+ (void)enableNavigationTransitionWithPanGestureBack
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method viewDidLoadMethod = class_getInstanceMethod([UINavigationController class], @selector(viewDidLoad));
Method transitionPanGestureDidLoadMethod = class_getInstanceMethod([UINavigationController class], @selector(transitionPanGestureDidLoad));
method_exchangeImplementations(viewDidLoadMethod, transitionPanGestureDidLoadMethod);
});
}
@end
@implementation UINavigationController (Transition)
- (void)transitionPanGestureDidLoad
{
if ([self isKindOfClass:[UINavigationController class]])
{
[self transitionPanGestureDidLoad];
//1.擷取系統interactivePopGestureRecognizer對象的target對象
id target = self.interactivePopGestureRecognizer.delegate;
//2.建立滑動手勢,taregt設定interactivePopGestureRecognizer的target,所以當介面滑動的時候就會自動調用target的action方法。
//handleNavigationTransition是私人類_UINavigationInteractiveTransition的方法,系統主要在這個方法裡面實現動畫的。
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] init];
[pan addTarget:target action:NSSelectorFromString(@"handleNavigationTransition:")];
//3.設定代理
pan.delegate = self;
//4.添加到導航控制器的視圖上
[self.view addGestureRecognizer:pan];
//5.禁用系統的滑動手勢
self.interactivePopGestureRecognizer.enabled = NO;
}
}
#pragma mark - 滑動開始會觸發
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint translat = [pan translationInView:pan.view];
if (translat.x < 0 ) {
return NO;
}
//只有導航的根控制器不需要右滑的返回的功能。
if (self.viewControllers.count <= 1)
{
return NO;
}
return YES;
}
@end
//直接上代碼 等你來拷貝
iOS 開發 右滑返回上一級控制器