美文网首页
ios 11 导航栏适配

ios 11 导航栏适配

作者: Rui哥 | 来源:发表于2017-10-29 20:38 被阅读986次

导航栏的差异

一.导航栏高度变化

  • 导航栏在ISO 10 之前都是默认的64,但是在ios 10 之后都变了,在ios 11 添加了大标题,如系统设置页面:
Snip20171029_9.png
  • ios11 新增 LargeTitleView专门用于显示大标题,不过默认是不显示的.
设置这个参数为yes 显示导航栏 大标题
 self.navigationController.navigationBar.prefersLargeTitles = YES;
  • 在 ios11 中iPhone X 和非iphonex 手机的导航栏还是有差异的.
非iPhone X ios11 导航栏结构:
20(状态栏) + 44(titleView) + 52(largeTitleView-- 这个是新增的)= 116
iPhone X ios11 导航栏结构:
44(状态栏) + 44(titleView) + 52(largeTitleView-- 这个是新增的)= 140
iphonex 小标题
statusBarFrame {{0, 0}, {375, 44}}  高度多22
navigationBarFrame: {{0, 44}, {375, 44}} y 下降22 高 不变
selfViewFrame: {{0, 0}, {375, 812}}
mainScreen: {{0, 0}, {375, 812}}
selfTabBarControllerTabBarFrame {{0, 729}, {375, 83}}

iphonex 大标题
statusBarFrame {{0, 0}, {375, 20}}
navigationBarFrame: {{0, 20}, {375, 96}}
selfViewFrame: {{0, 0}, {375, 667}}
mainScreen: {{0, 0}, {375, 667}}
selfTabBarControllerTabBarFrame {{0, 618}, {375, 49}}
 iphone 8 小标题
statusBarFrame {{0, 0}, {414, 20}}
navigationBarFrame: {{0, 20}, {414, 44}}
selfViewFrame: {{0, 0}, {414, 736}}
mainScreen: {{0, 0}, {414, 736}}
selfTabBarControllerTabBarFrame {{0, 687}, {414, 49}}

二.导航栏图层变化
ios11之前导航栏的title 是添加在UINavigationItemView上面,而navigationBarButton是直接添加在navigationBar 上面的,如果设置了titleView,则titleView也只直接添加在navigationBar 上面的.

在ios11 之后,苹果添加了新的类来管理.navigationBar 会添加在UIButtonBarStackView 上面的,而UIButtonBarStackView 则添加在UINavigationBarContentView上面,如果没有给titleView赋值,则titleView会直接添加在UINavigationBarContentView 上面,如果赋值了titleView 则会新生成UITAMICAdatptorView, 把titleViewtianjai 在这个类上面,这个类会添加在UInavigationBarContentView 上面.

三.导航栏的边距变化
在ios11 对导航栏里面的item的边距也做了调整:

(1) 如果只是设置了titleView,没有设置barbutton,把titleView的宽度设置为屏幕的宽度,则titleView 距离屏幕边距的: ios11 之前 iPhone 6p 上20 p 在iPhone6p 之前 是 16p,ios 11 之后 ,在iPhone6p上是12p,在iPhone6p 之前是8p.

(2) 如果设置了Barbutton,没有设置titleView,则在ios11 里,barbutton距离边距是20p 和16 p,在ios 11  之前barbutton 边距距离屏幕的边距也是20p 和 16p.

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

四. APP 需要实现导航栏左右按钮边距为0
在 ios 11 之前,可以设置一个width 为 负的navigationBarbutton,将按钮挤到边缘,变相实现0边距的导航栏按钮,但是,这招在ios11 失效了,原因在于UIButtonBarStackView,这个ios 9 之后出来的,用来相对布局的组件,限制了Veiw 的布局,那么怎么搞呢?

想到的方法有几个:

  1. 在viewWillAppear 里面,将UIButtonBarStackView 取出来,直接设置他的x坐标.
  2. 设置titleView ,然后将button 添加在titleView 上面,根据不同的边距做便宜.

列表的变化

一. automaticallyAdjustsScrollViewInsets
在ios11 之前,如果想要scrollview 不偏移64 ,则需要设置
automaticallyAdjustsScrollViewInsets = NO, 但是 这个属性在ios11 直接被抛弃了

tableView 默认使用self-Sizing
这个配合 estimatedRowHeight, estimatedSectionfooterheight, estimatedSectionHeaderheight 使用,可以预估高度.之前,设置header或者footer高度为0时,需要设置需要设置height = 0.1,才会起作用,如果直接设置为0 ,则会使用默认的高度.ios11 由于自动使用预估高度,所以,忽略了设置的高度,使用原来的高度增大了.只要把这个属性设置成0 就OK了.

ihonex 底部的tabbar 的高度改变

iPhonex 不仅多了刘海,底部还有一个半角的矩形,使得tabbar多出来了34p 的高度,不过不管导航栏和tabbar 一般的系统都会自动适配 safeArea

ios 11 iphonex 页面push 时 tabbar位置变化

相关文章

网友评论

      本文标题:ios 11 导航栏适配

      本文链接:https://www.haomeiwen.com/subject/plnypxtx.html