第一种方式:在AppDelegate.m添加下面两行代码,即可实现让背景图片穿透导航栏,而且不带下划线。
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
第二种方式:自定义导航栏
有时系统自带的back样式不符合我们的需求,虽然通过系统提供的方法改变其背景颜色和标题,但是图片我们却不能修改,这就需要我们自定义一个back。可以写一个自己的UINavigationController的子类来自定义back,在自定义的类里面要实现穿透导航栏效果,代码如下
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
[self.navigationBar setShadowImage:[[UIImage alloc] init]];
}
要让我们push出来的每个页面的back都是我们自定义的,代码如下
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.childViewControllers.count>0) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
CGRect frame = button.frame;
frame.size = CGSizeMake(70, 30);
button.frame = frame;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:button];
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:YES];
}
-(void)back{
[self popViewControllerAnimated:YES];
}
这样点击back可以返回了,但是当我们点击屏幕左侧边缘右滑,返回上一界面的效果却没有了,别急,只需要在一级界面设置以下代码即可
self.navigationController.interactivePopGestureRecognizer.delegate=(id)self;
这样就可以实现既自定义了back又有了点击屏幕左侧边缘右滑返回上一界面的效果
但是当你在华东的时候会发现一个问题,当我们在第一级界面右滑后,在点击push到下一个页面就会卡在第一级页面,因为第一级页面上面已经相关页面了,所以造成了app卡死。
解决方案:在一级页面出现后禁用右滑手势,在一级页面消失后开始右滑手势
通过UIGestureRecognizerDelegate的一个代理方法
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
}
来监听手势是否启动
下面的代码是抄别人的,后面会附上链接
/*在一级界面显示出来后取消右滑手势*/
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self cancelSideBack];
}
/*在一级界面消失后开启右滑手势*/
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[self startSideBack];
}
/**
* 关闭ios右滑返回
*/
-(void)cancelSideBack{
self.isCanUseSideBack = NO;
if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate=(id)self;
}
}
/*
开启ios右滑返回
*/
- (void)startSideBack {
self.isCanUseSideBack=YES;
if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
/*当在第一级界面右滑时会返回yes,因为可能你已经push过了然后又pop回来,以至于右滑被关闭,所以需要设置为yes*/
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {
return self.isCanUseSideBack;
}