• [BS-31]导航控制器的interactivePopGestureRecognizer属性


    导航控制器的interactivePopGestureRecognizer属性

    如何自定义导航控制器push出来的视图控制器的左侧返回按钮?

    首先需要知道的是:如果要自定义push出来的VC的左侧返回按钮,直接设置vc.navigationItem.backBarButtonItem是不行的。 那么要想自定义返回按钮可以通过以下两种方案:

    方案一、 

    setBackButtonBackgroundImage 和 setBackButtonTitlePositionAdjustment

    UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];  
    
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
      
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];  

    但是这种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。

    方案二、 直接自定义navigationItem.leftBarButtonItem来替代backBarButtonItem。这种最直接最简单。但是这种方案会使得push出来的VC的右滑pop返回功能失效。

    //WZNavigationController.m
    //
    重写navC的pushVC方法,以便统一设置push进来的vc的左侧“返回”按钮 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.bounds = CGRectMake(0, 0, 100, 21); //必须设置尺寸大小 [btn setTitle:@"返回" forState:UIControlStateNormal]; btn.titleLabel.font = [UIFont systemFontOfSize:15]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; [btn setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal]; [btn setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted]; //设置btn内容水平靠左 btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; //设置-10的内边距,让它更靠左(-10特殊用法) btn.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0); //btn添加事件 [btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; //**此处自定义了leftBarButtonItem,就会使导航控制器自带的右滑pop返回的功能失效,修复此bug只需在viewDidLoad中将代理清空 viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:btn]; //当vc被push进入nav时隐藏底部bar viewController.hidesBottomBarWhenPushed = YES; //这句会立即调用被push的VC的viewDidLoad方法,必须放在最后面,否则上面的代码会对viewDidLoad中代码造成覆盖,导致viewDidLoad设置无效。 [super pushViewController:viewController animated:animated]; }

    苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecognizer.enabled = YES;  这个api功能就是在NavigationController堆栈内的UIViewController可以支持右滑手势,也就是不用点击右上角的返回按钮,轻轻在屏幕左边一滑,屏幕就会返回,随着ios设备屏幕的增大,这个小功能让手指短,拇指大和手残人士看到了福音。

    这个功能是好,但是经常我们会有需求定制返回按钮,如果手动定制了返回按钮,这个功能将会失效,也就是自定义了navigationItem的leftBarButtonItem,那么这个手势就会失效。解决方法找到两种:

     1.可以在pushViewController之后,还原手势的delegate

    [_currentNav pushViewController:viewController animated:YES];  

    //还原手势的delegate

    _currentNav.interactivePopGestureRecognizer.delegate = nil;  

    2.在被push的VC的viewWillAppear(不能再viewDidLoad)中写上:

    self.navigationItem.backBarButtonItem = backButton;  

    self.navigationController.interactivePopGestureRecognizer.delegate = self;  

    但这两行代码必须放,相比上一种方式要修改的代码更多,因此建议使用上一种方式

     

    3.当然你也可以自己响应这个手势的事件

     [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];

    这里可以根据自己需要进行选择,如果只是简单定制了返回按钮,第一种最简单,一句代码搞定。

    参考:http://blog.csdn.net/zhaoxy_thu/article/details/15811189

  • 相关阅读:
    高精度减法
    HDU 4460 Friend Chains
    POJ 2386 Lake Counting
    POJ 1852 Ants
    HDU 1240 Asteroids!
    SQL注入之Sqli-labs系列第三十六关(基于宽字符逃逸GET注入)和三十七关(基于宽字节逃逸的POST注入)
    SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
    SQL注入之Sqli-labs系列第三十三关(基于宽字符逃逸注入)
    SQL注入之Sqli-labs系列第三十关(基于WAF防护的双引号报错注入)和三十一关
    墨者-uWSGI 漏洞复现(CVE-2018-7490)
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5601050.html
Copyright © 2020-2023  润新知