在项目中遇到,需求:A 界面存在导航控制器 push 到B界面隐藏导航栏,现在需要从B界面侧滑返回A界面。
直接上代码:
A (controller):
.h 文件
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
.m文件
#import "ViewController.h"
#import "ViewController2.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
ViewController2 * vc2 = [[ViewController2 alloc] init];
[self.navigationController pushViewController:vc2 animated:YES];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
@end
B(viewcontroller):
.h文件
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface ViewController2 : UIViewController
@end
NS_ASSUME_NONNULL_END
.m文件
#import "ViewController2.h"
@interface ViewController2 ()<UIGestureRecognizerDelegate>
@property(nonatomic,strong) id interactivePopDelegate ;
@end
@implementation ViewController2
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
}
// 在页面将要出现时,记录原始侧滑手势代理对象,并将手势代理设置为当前页面
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.interactivePopDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// 在页面消失时,还原侧滑手势代理对象
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
self.navigationController.interactivePopGestureRecognizer.delegate = self.interactivePopDelegate;
self.interactivePopDelegate = nil;
}
// 实现手势代理,为了防止影响其他手势,可以判断一下手势类型
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
return YES;
}
// ...... 其他手势的处理
return NO;
}