IOS全屏左侧滑(系统方法)
2016-05-04 12:59
423 查看
1.在自定义的NavigationController中遵守<UIGestureRecognizerDelegate>。
2.在ViewDidLoad里调用setupSlideGesture方法。
做到以上两步就能实现简单的全屏侧滑,但是如果项目中有的页面navigationBar是需要隐藏的,这时全屏侧滑过渡到这个页面时会很难看,而且还会出现NavigationBar内栈顺序错乱(例如需要隐藏Bar的页面是A,A页面Push出的某个页面为B,这时在页面B上来回拖动但不完全滑到A页面,滑动多次后再滑到A,然后从A再Push到B这时B的NavigationBar上得标题可能就会错乱)。
在需要隐藏NavgationBar的当前VC中添加
[self.navigationControllersetNavigationBarHidden:YESanimated:YES];解决以上问题。
- (void)setupSlideGesture {
UIGestureRecognizer *gesture =self.interactivePopGestureRecognizer;
gesture.enabled =NO;
UIView *gestureView = gesture.view;
UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizeralloc]init];
popRecognizer.delegate =self;
popRecognizer.maximumNumberOfTouches =1;
[gestureView addGestureRecognizer:popRecognizer];
/**
* 获取系统手势的target数组
*/
NSMutableArray *_targets = [gesturevalueForKey:@"_targets"];
/**
* 获取它的唯一对象,我们知道它是一个叫UIGestureRecognizerTarget的私有类,它有一个属性叫_target
*/
id gestureRecognizerTarget = [_targetsfirstObject];
/**
* 获取_target:_UINavigationInteractiveTransition,它有一个方法叫handleNavigationTransition:
*/
id navigationInteractiveTransition = [gestureRecognizerTargetvalueForKey:@"_target"];
/**
* 通过前面的打印,我们从控制台获取出来它的方法签名。
*/
SEL handleTransition =NSSelectorFromString(@"handleNavigationTransition:");
/**
* 创建一个与系统一模一样的手势,我们只把它的类改为UIPanGestureRecognizer
*/
[popRecognizer addTarget:navigationInteractiveTransitionaction:handleTransition];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
/**
* 这里有两个条件不允许手势执行,1、当前控制器为根控制器;2、如果这个push、pop动画正在执行(私有属性)
*/
returnself.viewControllers.count
!=1 && ![[selfvalueForKey:@"_isTransitioning"]boolValue];
}
2.在ViewDidLoad里调用setupSlideGesture方法。
做到以上两步就能实现简单的全屏侧滑,但是如果项目中有的页面navigationBar是需要隐藏的,这时全屏侧滑过渡到这个页面时会很难看,而且还会出现NavigationBar内栈顺序错乱(例如需要隐藏Bar的页面是A,A页面Push出的某个页面为B,这时在页面B上来回拖动但不完全滑到A页面,滑动多次后再滑到A,然后从A再Push到B这时B的NavigationBar上得标题可能就会错乱)。
在需要隐藏NavgationBar的当前VC中添加
[self.navigationControllersetNavigationBarHidden:YESanimated:YES];解决以上问题。
- (void)setupSlideGesture {
UIGestureRecognizer *gesture =self.interactivePopGestureRecognizer;
gesture.enabled =NO;
UIView *gestureView = gesture.view;
UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizeralloc]init];
popRecognizer.delegate =self;
popRecognizer.maximumNumberOfTouches =1;
[gestureView addGestureRecognizer:popRecognizer];
/**
* 获取系统手势的target数组
*/
NSMutableArray *_targets = [gesturevalueForKey:@"_targets"];
/**
* 获取它的唯一对象,我们知道它是一个叫UIGestureRecognizerTarget的私有类,它有一个属性叫_target
*/
id gestureRecognizerTarget = [_targetsfirstObject];
/**
* 获取_target:_UINavigationInteractiveTransition,它有一个方法叫handleNavigationTransition:
*/
id navigationInteractiveTransition = [gestureRecognizerTargetvalueForKey:@"_target"];
/**
* 通过前面的打印,我们从控制台获取出来它的方法签名。
*/
SEL handleTransition =NSSelectorFromString(@"handleNavigationTransition:");
/**
* 创建一个与系统一模一样的手势,我们只把它的类改为UIPanGestureRecognizer
*/
[popRecognizer addTarget:navigationInteractiveTransitionaction:handleTransition];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
/**
* 这里有两个条件不允许手势执行,1、当前控制器为根控制器;2、如果这个push、pop动画正在执行(私有属性)
*/
returnself.viewControllers.count
!=1 && ![[selfvalueForKey:@"_isTransitioning"]boolValue];
}
相关文章推荐
- iOS之JS交互
- iOS 取得ipa里面的图片
- 判断 iOS wifi 是否打开
- iOS 毛玻璃
- Runtime方法的使用—Protocol、SEL篇
- iOS tableView分组
- iOS开发中如何自定义tableView的分割线
- iOS开发之自定义AlertView
- iOS不同模式返回根视图的方法
- 对iOS图片保护的理解
- iOS 获取当前时间
- IOS开发通知与消息机制
- iOS tableViewCell 点击后没有任何变化
- MPVolumeSettingsAlertShow
- iOS中JSON字符串转换成字典
- iOS 按钮上的文字添加下划线的方法
- xcode运行到真机报错 图片问题
- iOS网址识别url中包含有特殊字符时需要转义
- iOS与JS交互实战篇(ObjC版)
- iOS的不同绘图系统