1.导航栏图层变化
ios10以前
ios11
在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