ios 导航栏返回按钮点击不灵敏问题

1.导航栏图层变化

ios10以前

ios 导航栏返回按钮点击不灵敏问题_第1张图片

ios11

ios 导航栏返回按钮点击不灵敏问题_第2张图片

在iOS11之后,苹果添加了新的类来管理,navigationBar会添加在_UIButtonBarStackView上面,而_UIButtonBarStackView则添加在_UINavigationBarContentView上面;如果没有给titleView赋值,则titleView会直接添加在_UINavigationBarContentView上面,如果赋值给了titleView,则会新生成_UITAMICAdaptorView,把titleView添加在这个类上面,这个类会添加在_UINavigationBarContentView上面,

2.边距

1)如果只是设置了titleView,没有设置barbutton,把titleview的宽度设置为屏幕宽度,则titleview距离屏幕的边距,iOS11之前,在iPhone6p上是20p,在iPhone6p之前是16p;iOS11之后,在iPhone6p上是12p,在iPhone6p之前是8p。

2)如果只是设置了barbutton,没有设置titleview,则在iOS11里,barButton距离屏幕的边距是20p和16p;在iOS11之前,barButton距离屏幕的边距也是20p和16p。

3)如果同时设置了titleView和barButton,则在iOS11之前,titleview和barbutton之间的间距是6p,在iOS11上titleview和barbutton之间无间距

3.手机在升级ios11之后 导航返回按钮变的特别不灵敏,个人的处理方案是:

在iOS11之前,可以设置一个width为负的navigationBarButton,将按钮挤到边缘,变相实现0边距的导航栏按钮,但是,这招在iOS11失效了,原因在于_UIButtonBarStackView,这个iOS9之后出来的,用来相对布局的组件,限制了子view的布局

ios10 之前原来的方案:

     UIButton *btnLeft = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20,20)];
    [btnLeft setTitle:@"" forState:UIControlStateNormal];
    [btnLeft setBackgroundImage:ImageNamed(@"navigationBar_popBack") forState:UIControlStateNormal];
    btnLeft.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        [btnLeft addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];        
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:btnLeft];
    
    UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
    negativeSpacer.width = -5;
    [self.navigationItem setLeftBarButtonItems:@[negativeSpacer,leftItem]];

iOS 11之后做了以下调整:

    UIButton *btnLeft = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30,44)];
    [btnLeft setTitle:@"" forState:UIControlStateNormal];
    [btnLeft setImage:ImageNamed(@"navigationBar_popBack") forState:UIControlStateNormal];
    btnLeft.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        [btnLeft addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];        
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:btnLeft];
    
    UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
    negativeSpacer.width = 0;
    [self.navigationItem setLeftBarButtonItems:@[negativeSpacer,leftItem]];

1)将按钮的宽度变大 内容靠左显示

主要考虑到用户点击的区域 如果靠右显示的话用户点击了那么右边的部分可能没反应 因为到边上了。

2)设置image 而不是backgroundImage 防止返回箭头变形 这时候可以在原来的基础上 把箭头的切图尺寸稍微放大些比如可以设置(40px*40px)

3)原来设置了leftspace 为负值 现在将其设置位0 或者直接不要也行。


注:参考链接:App界面适配iOS11

你可能感兴趣的:(ios 导航栏返回按钮点击不灵敏问题)