码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 11 使用方法替换(Method Swizzling),去掉导航栏返回按钮的文字

时间:2018-05-04 18:21:03      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:nbsp   ima   cto   bool   图片   add   control   赋值   text   

    方法一:设置BarButtonItem的文本样式为透明颜色,代码如下:

[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];   
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted];

 

    此外这种方法会导致title不能居中,被偏移很多,如下所示(虽然不被显示,也占了导航栏左边很大一部分位置)

技术分享图片

 

     方法二:给UIViewController添加类别,然后在load方法里面用Method Swzilling方法替换 交换ViewDidAppear,部分代码如下

+(void)load {
    swizzleMethod([self class], @selector(viewDidAppear:), @selector(ac_viewDidAppear));
}

- (void)ac_viewDidAppear{
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
                                              initWithTitle:@""
                                              style:UIBarButtonItemStylePlain
                                              target:self
                                              action:nil];
    [self ac_viewDidAppear];
}

void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector)
{
    // the method might not exist in the class, but in its superclass
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    
    // class_addMethod will fail if original method already exists
    BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
    
    // the method doesn’t exist and we just added one
    if (didAddMethod) {
        class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
    }
    else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}

 

注意事项:

  • 要给整个backButtonItem赋值才可以,??这种方法不行,因为backBarButtonItem默认为空,给nil方法消息,默认声明都不执行(参考官网
self.navigationItem.backBarButtonItem.title = @" ";

 

  • leftBarButtonItem 与backBarButtonItem 的显示关系:
    有leftBarButtonItem则优先显示当前VC的leftBarButtonItem,无则显示上个VC的backBarButtonItem,再无则显示上个VC的title(参考官网   还是官网解释的清楚)
 

 

技术分享图片

 

iOS 11 使用方法替换(Method Swizzling),去掉导航栏返回按钮的文字

标签:nbsp   ima   cto   bool   图片   add   control   赋值   text   

原文地址:https://www.cnblogs.com/Apple2U/p/8991662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!