• 关于backBarButtonItem的N种方法


    替换返回按钮的文字

    很多app的要求所有的返回按钮的title都是“返回”,如果上一层题目文字太多,下一层的返回按钮文字就会显示不完全,而且这样可以使软件显得整洁。

    方法一:

    最普通的想法,A界面的navigationItem.backBarButtonItem修改的是B(A的下一级)界面的返回按钮,所以可以写一个BaseViewController,让所有的UIViewController继承它,像这样

    1
    2
    3
    4
    - (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
    }

    方法二:

    思路是:在开启程序时,使用Method Swizzling,将系统自带的backBarButtonItem方法替换成我们自定义的方法。

    具体实现就是创建个 UINavigationItem + BackItem 的类别,当系统执行+load方法时,将backBarButtonItem方法和myCustomBackButton方法交换,利用iOS关联方法(objc_getAssociatedObject,objc_setAssociatedObject)static区创建个backItemButton用来展示。这个方法的好处就是将类别导入到工程里不用任何代码就可以实现,上代码吧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    +(void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    Method originalMethodImp = class_getInstanceMethod(self, @selector(backBarButtonItem));
    Method destMethodImp = class_getInstanceMethod(self, @selector(myCustomBackButton));
    method_exchangeImplementations(originalMethodImp, destMethodImp);
    });
    }

    static char kCustomBackButtonKey;

    -(UIBarButtonItem *)myCustomBackButton{
    UIBarButtonItem *item = [self myCustomBackButton];
    if (item) {
    return item;
    }
    item = objc_getAssociatedObject(self, &kCustomBackButtonKey);
    if (!item) {
    item = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:NULL];
    objc_setAssociatedObject(self, &kCustomBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
    }

    - (void)dealloc
    {
    objc_removeAssociatedObjects(self);
    }

    返回按钮只显示自定义图片

    方法一:

    最开始我的方案是实现UINavigationController的代理判断是否是栈底,如果不是就修改leftBarButtonItem的样式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    UIViewController *root = navigationController.viewControllers[0];

    if (root != viewController) {
    UIBarButtonItem *itemleft = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"backBtn"] style:UIBarButtonItemStylePlain target:self action:@selector(popAction:)];
    viewController.navigationItem.leftBarButtonItem = itemleft;
    }
    }


    - (void)popAction:(UIBarButtonItem *)barButtonItem
    {
    [self.navigationController popViewControllerAnimated:YES];
    }

    iOS7.0出了之后,这并不是一个好的解决方案。因为iOS7.0之后如果把backItemButton替换成leftItemButon,interactivePopGestureRecognizer手势就没有了。虽然可以使用

    1
    self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

    将手势再加上,但实在是有些麻烦。。可是很多大公司用的都是这个方法。

    方法二:

    这个方法和上边‘替换返回按钮的文字’方法二大致一样,这句话要替换:

    1
    item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back"] style:UIBarButtonItemStylePlain target:nil action:nil];

    这句话要加上,用来去除系统自带的返回按钮上的尖脚号。

    1
    2
    [[UINavigationBar appearance] setBackIndicatorImage:[[UIImage alloc]init]];
    [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[[UIImage alloc] init]];

    另外.....

    我的愿望是.......

    世界和平.........

     

  • 相关阅读:
    Apache 安装及常用参数设置
    Apache 开启压缩传输
    在 CentOS 上编写 init.d service script [转]
    学习资源
    IO流(10)复制多级文件夹
    IO流(9)复制指定文件夹下指定文件到目的文件夹,并改名
    IO流(8)递归删除带文件的目录
    IO流(7)获取指定文件夹下的所有文件
    IO流(6)获取功能
    IO流(5)判断功能
  • 原文地址:https://www.cnblogs.com/ioshe/p/5481458.html
Copyright © 2020-2023  润新知