UINavigationController 背景图片穿透导航栏以及一级界面系统自带右滑手势卡死

第一种方式:在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;  
}

参考链接http://write.blog.csdn.net/postedit?ref=toolbar

猜你喜欢

转载自blog.csdn.net/li15809284891/article/details/53526792