ios全局返回按钮和全屏侧滑功能

一. 解释返回控制器

1. 导航条返回控制器按钮:当一个控制器进入另外一个控制器的时候,需要从另外一个控制器中返回,如果程序猿不自定义返回按钮,那么控制器中的导航条会默认返回按钮在导航条的左侧.
2. 功能图

导航条左上角返回按钮

二. 全局返回按钮—–方法一

1. 思路:重写push方法.重写系统的push方法,就能实现全局返回按钮的功能.
1.1 push方法代码:
//重写系统的push方法
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
   //如果当前的控制器数不等于0,那么说明有子控制器,此时才需要返回按钮
    if (self.childViewControllers.count != 0) {
         NSLog(@"非根控制器");
        //设置返回按钮
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageWithOriImageName:@"NavBack"] style:0 target:self action:@selector(back)];
    }
    //如果控制器的数量等于0,那么久保持系统原有的做法
    [super pushViewController:viewController animated:animated];
}
1.2 push方法中跳转控制器的方法实现:
//监听跳转控制器方法的实现
- (void)back {
    //返回上一个控制器
    [self popViewControllerAnimated:YES];
}
1.3 注意:如果就这样直接将图片设置到导航条上,图片会渲染,那么就达不到想要的效果.那么我给大家提供一个分类,大家只要使用这个分类中的方法就可以实现对图片的保护不被渲染.(直接在设置图片的时候就直接调用这个方法)
+ (UIImage *)imageWithOriImageName:(NSString *)imageName {

    //传入一张图片,返回一张不被渲染的图片
    UIImage *image = [UIImage imageNamed:imageName];
    return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

}

三. 全局返回按钮—–方法二

1. 方法二思路:由于我们知道,系统本身就自带了返回控制器的按钮,只是系统的按钮会配有文字说明,我们要求的返回按钮是没有返回按钮的描述.所以我们可以想办法让描述的文字离开屏幕,然后再将颜色修改为自己想要的颜色,就能达到效果.
1.1 拿到全局导航条中的item
 //拿到全局的导航条中的item--->这种方法比较霸道
    UIBarButtonItem *item = [UIBarButtonItem appearance];
1.2 设置返回按钮的颜色为自己需求的颜色
 //设置图片颜色
    NSMutableDictionary *dict2 = [NSMutableDictionary dictionary];
    dict2[NSForegroundColorAttributeName] = [UIColor whiteColor];

    [item setTitleTextAttributes:dict2 forState:UIControlStateNormal];
1.3 设置返回按钮的描述文字尺寸—-离开屏幕的尺寸
//将返回按钮的描述文字尺寸设置为离开屏幕的尺寸
    [item setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
1.4 这种方法同样能达到效果(比较容易实现)

四. 方法一带来的后遗症及解决方法

1. 当重写了系统的push方法时,系统的侧滑功能就会失效.
2. 侧滑功能实现原理:当用户使用侧滑功能的时候,系统是通过代理去通知实现侧滑功能,但是如果重写了push,那么代理知道,既然重写了push方法,那么代理就会通知系统不要去实现侧滑功能,这样就使得侧滑功能失效,或者产生bug.
3. 思路:我们就通过对代理的控制,来实现对侧滑功能的控制
3.1 设置一个属性,用来保存在push方法重写之前的代理
//设置一个属性保存系统的代理
@property (nonatomic, strong) id popDelegate;
//将系统的代理保存(在view加载完毕就赋值--->viewDidLoad)
    self.popDelegate = self.interactivePopGestureRecognizer.delegate;
3.2 在重写的push方法中,让代理等于空—-意思是不让代理去通知系统侧滑功能失效
self.interactivePopGestureRecognizer.delegate = nil;
3.3 在代理方法中,将原来保存的代理属性,赋值给系统,让系统代理保持原来的工作
#pragma mark - 实现代理方法

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    //判断控制器是否为根控制器
    if (self.childViewControllers.count == 1) {
        //将保存的代理赋值回去,让系统保持原来的侧滑功能
        self.interactivePopGestureRecognizer.delegate = self.popDelegate;
    }
}
4. 这样就完整的解决了重写push方法后,侧滑功能失效的问题

五. 全局侧滑功能

1. 概念:所谓全局侧滑功能,指的是在非根控制器中,只要滑动屏幕的某一部分就能达到返回控制器的效果.”四”中的侧滑功能仅仅局限于用户从屏幕的最侧边才能滑动,意思是当用户想从屏幕的中间滑动切换控制器的时候,是不管用的.
2. 实现思路: 添加手势
2.1 添加滑动手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
2.2 方法handleNavigationTransition:怎么出现?
  //通过直接打印就能得出此参数
  NSLog(@"%@",self.interactivePopGestureRecognizer);
2.3 设置手势的代理为控制器
//设置手势的代理为当前控制器,让控制器去执行
    pan.delegate = self;
2.4 实现代理方法
#pragma mark - 实现手势代理方法

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    //如果控制器的数量不为1
    return self.childViewControllers.count != 1;
}
3. 这样就能实现全屏侧滑

六. 总结

1. 以上仅仅是一部分方法,还有其它的就交给大家来实现了,有什么问题,直接给我留言,一起进步,谢谢!!!!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值