iOS11 导航栏UIBarButtonItem自定义按钮偏移问题

前言

最近iOS11 发放出来已经有一段时间了,不得不说每到9月,都是果粉兴奋,iOS代码狗抓狂的时候。。。。
iOS 11 放出来,于是各种各样的坑也就跟预留好了。。。
其中一个比较烦人的坑就是导航栏UIBarButtonItem自定义按钮偏移 在iOS11 系统下 通过以前的UIBarButtonSystemItemFixedSpace的方式已经无法修复了。。。。。
所以我们也是尝试了各种方法去填iOS11给我们挖的坑。。。

iOS11 和iOS11效果图如下:(响应范围可以自己亲测调试)

iOS11 导航栏UIBarButtonItem自定义按钮偏移问题_第1张图片
**左边是iOS11 5S, 右边是iOS10 SE**

目前网上比较流行的方法

方法一:iOS11 导航栏按钮位置问题的解决

作者:spicyShrimp
http://blog.csdn.net/spicyShrimp/article/details/77891717
附上地址,大家可以去看一下,利用各种黑魔法解决了这个bug,不论是修复点击范围,还是视图布局都做到了完美解决,但问题就是这个方案的代价比较大。

方法一:iOS11导航栏自定义按钮偏移问题

作者:可可西里的藏野驴
http://blog.csdn.net/guo4114/article/details/78053025
这个方法只是解决了视图问题,但还有一个实质问题尚未解决,就是返回按键的点击位置依旧没有改变,大家可以试一试。

我的方法

具体思路是: 先修改button 的视图布局,再修改button 的响应范围。

第一步:适配系统,iOS11 系统以下,依旧保持不变

 UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
    [backButton setNormalImage:[UIImage imageNamed:@"mine_back_cheng"]];
    [backButton setHighlightedImage:[UIImage imageNamed:@"mine_back_white"]];
    [backButton addClickEventWithBlock:clickHandler];
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
    //配置返回按钮距离屏幕边缘的距离
    UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    spaceItem.width = -10.0f;
    self.navigationItem.leftBarButtonItems = @[spaceItem,backItem];

第二步:iOS11 系统下,修改UI布局

依旧在上面的代码进行系统区分,修改布局

 UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
    [backButton setNormalImage:[UIImage imageNamed:@"mine_back_cheng"]];
    [backButton setHighlightedImage:[UIImage imageNamed:@"mine_back_white"]];
    [backButton addClickEventWithBlock:clickHandler];
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
    //配置返回按钮距离屏幕边缘的距离
    UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    spaceItem.width = -10.0f;
// iOS 11 系统,将Button的内容 和 图片根具体需求进行便处理
if (([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.0)) {
        backButton.contentEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
        backButton.imageEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
    }
    self.navigationItem.leftBarButtonItems = @[spaceItem,backItem];

第三步:修改布局之后,修改UIBarButtonItem 的响应范围。

        backButton.contentEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
        backButton.imageEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);

只是修改了 返回Button 的视图,没有对返回Button的实际响应范围进行修改。所以下面的实际修改范围 需要加入这个一段代码,来修改button的响应范围。

       // 修改返回**Button**的响应范围 ,往左边扩大6 个胆怯
        backButton.hitEdgeInsets =UIEdgeInsetsMake(0, -6, 0, 0);

WHAT?? hitEdgeInsets button 有这个东西吗???

确实没有。这个只是我们给UIButton利用分类Category,添加的一个属性,来修改button 的响应范围。
具体代码和方式参考:
UIButton 扩大按钮的响应区域(runtime)


最终代码:

由于修改的东西不多,我这里就把代码贴出来就好了:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"注册";
    kDefineWeakSelf;
    [self showCustomLeftImgBarButton:^(UIButton *button) {
        [weakSelf.navigationController popViewControllerAnimated:YES];
    }];
    // Do any additional setup after loading the view.
}

-(void)showCustomLeftImgBarButton:(void (^)(UIButton *button))clickHandler{
    UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
    [backButton setNormalImage:[UIImage imageNamed:@"mine_back_cheng"]];
    [backButton setHighlightedImage:[UIImage imageNamed:@"mine_back_white"]];
    [backButton addClickEventWithBlock:clickHandler];
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
    //配置返回按钮距离屏幕边缘的距离
    UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    spaceItem.width =  kIOS11_OR_LATER? 0:fixSpacing;
    if (kIOS11_OR_LATER) {
        backButton.contentEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
        backButton.imageEdgeInsets =UIEdgeInsetsMake(0, -15,0, 0);
        backButton.hitEdgeInsets =UIEdgeInsetsMake(0, -6, 0, 0);
    }
    self.navigationItem.leftBarButtonItems = @[spaceItem,backItem];
}

UIButton利用分类Category,添加的一个属性,来修改button 的响应范围。
具体代码和方式参考:
UIButton 扩大按钮的响应区域(runtime)

你可能感兴趣的:(iOS11 导航栏UIBarButtonItem自定义按钮偏移问题)