美文网首页
iOS导航条设置自定义返回按钮系统右滑失效问题

iOS导航条设置自定义返回按钮系统右滑失效问题

作者: 加盐白咖啡 | 来源:发表于2019-08-14 21:22 被阅读0次

仅供记录设置自定义返回按钮后,系统的手势滑动返回失效的解决办法


#import "JMCNavigationViewController.h"
#import <objc/runtime.h>

@interface JMCNavigationViewController () <UINavigationControllerDelegate, UIGestureRecognizerDelegate>
// 记录系统手势代理
@property (nonatomic, strong) id popGesture;
@end
@implementation JMCNavigationViewController

// 第一次初始化这个类调用,只调用一次
+ (void)initialize
{
    if (self == [JMCNavigationViewController class]) {
        // 获取导航条标识
        UINavigationBar *bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[self]];
        
        // 设置导航条的背景图片,只能使用默认模式
        [bar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:(UIBarMetricsDefault)];
        // 设置导航字体颜色大小
        NSMutableDictionary *dictM = [NSMutableDictionary dictionary];
        // 字体大小
        dictM[NSFontAttributeName] = [UIFont boldSystemFontOfSize:22];
        // 字体颜色
        dictM[NSForegroundColorAttributeName] = [UIColor whiteColor];
        
        [bar setTitleTextAttributes: dictM];
        
        //    // 另一种方式实现不带标题的返回按钮(不好使)
        //    // 设置颜色
        //    [bar setTintColor:[UIColor whiteColor]];
        //    // 获取当前导航栏的item
        //    UIBarButtonItem *item = [UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[self]];
        //    // 把返回标题移除到屏幕外面
        //    [item setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -100) forBarMetrics:UIBarMetricsDefault];
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // 恢复系统的滑动返回手势
    // 记录系统滑动手势代理
    self.popGesture = self.interactivePopGestureRecognizer.delegate;
    // 设置navigation代理
    self.delegate = self;

    // 全屏滑动移除控制器(系统默认是屏幕左侧滑动可以返回)
    UIScreenEdgePanGestureRecognizer *panS = self.interactivePopGestureRecognizer;
    
    // 打印私有属性
    // runtime 运行机制,只能获取当前类的私有属性
    //    unsigned int outCount = 0;
    //    Ivar *ivars = class_copyIvarList([UIGestureRecognizer class], &outCount);
    //    for (int i = 0 ; i < outCount; i++) {
    //        NSLog(@"%@",[NSString stringWithUTF8String:ivar_getName(ivars[i])]);
    //    }
    
    
    // 获取私有属性
    NSArray *targets = [panS valueForKey:@"_targets"];
    id target = [targets[0] valueForKey:@"target"];
    // 添加自己的手势到系统
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    [self.view addGestureRecognizer:pan];
    // 添加代理,屏蔽根控制器禁止滑动,如果在根控制器滑动会卡死
    pan.delegate = self;
}

#pragma mark - UIGestureRecognizerDelegate 手势代理方法
// 开始滑动的时候会调用,返回YES 可以滑动,返回NO 不能滑动
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    // 如果大于1个控制器,就说明不是在根控制器,就返回YES
    return self.viewControllers.count > 1;
}

#pragma mark - UINavigationControllerDelegate 导航条代理方法
// 获取当前显示的控制器
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // 判断第一个是不是根控制器
    if (self.viewControllers[0] == viewController) {
        // 还原系统手势代理
        self.interactivePopGestureRecognizer.delegate = self.popGesture;
    } else
    {
        // 因为设置了返回键,清空系统手势代理,就能实现滑动
        self.interactivePopGestureRecognizer.delegate = nil;
    }
}

// 统一设置非根控制器的返回键
#pragma mark - 重写方法,统一设置返回键
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [super pushViewController:viewController animated:animated];
    // 设置非根控制器返回键
    // 如果在导航控制器设置统一返回按钮,就没有手势返回功能了
    if (self.viewControllers.count > 1) {
        // imageWithRenderOriginalName 分类中自定义的不渲染图片的方法
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageWithRenderOriginalName:@"NavBack"] style:0 target:self action:@selector(backClick)];
    }
}

- (void)backClick {
    [self popViewControllerAnimated:YES];
}

@end

相关文章

  • 关于APP右滑返回无效和卡死等问题

    自定义返回按钮后, 右滑返回会失效。 解决方法: 在BaseViewController里面代码设置 右滑返回的代...

  • 自定义NavigationController的一般过程

    iOS NavigationController侧滑返回失效。 用leftBarButtonItem自定义返回按钮...

  • 无标题文章

    //解决自定义navgation返回按钮,右滑返回失效 -(void)viewWillAppear:(BOOL)a...

  • iOS导航条设置自定义返回按钮系统右滑失效问题

    仅供记录设置自定义返回按钮后,系统的手势滑动返回失效的解决办法

  • iOS 右滑返回手势

    这篇文章主要解决两个问题:1.自定义导航栏返回按钮右滑返回手势失效的问题。2.实现整个屏幕右滑就返回功能。(动画效...

  • 侧滑返回功能

    既要自定义返回按钮,也要侧滑返回功能!! 当我们用自定义的按钮覆盖了系统的返回按钮时,侧滑返回功能会失效。 为什么...

  • 【iOS开发】Push时,画面卡住

    背景 使用leftBarButtonItem实现自定义返回按钮,从而导致侧滑返回失效。为了解决侧滑返回失效的问题,...

  • 系统导航右侧按钮侧滑变灰

    需求:自定义返回按钮之后,能正常使用系统侧滑返回。 问题:自定义返回按钮之后,发现侧滑返回时,系统导航右侧按钮侧滑...

  • iOS 导航栏技巧

    1.当使用自定义的左侧导航栏的按钮的时候,左滑返回手势失效: 2.导航条的穿透效果:可用于用户界面 3.设置导航条的图片

  • 2018-05-31iOS相关杂乱知识点

    一:如果自定义了返回按钮,如果右滑手势失效那么在基类添加下面代码 #pragma mark 修改自定义返回按钮之后...

网友评论

      本文标题:iOS导航条设置自定义返回按钮系统右滑失效问题

      本文链接:https://www.haomeiwen.com/subject/wdxojctx.html