问题:
个人测试,在ios8
ios10
上TableView
上面出现一段空白,ios11
上没问题,逆向查看了一下,发现结构是这样的:
TableViewCell整体下移。
问题原因:
iOS7以后tableView中间也多了一层UITableViewWrapperView,我们平时放的cell都是放到了UITableViewWrapperView上,并没有直接放到tableView上。
navigationController
的automaticallyAdjustsScrollViewInsets
属性为yes
时会自动对contentview
上的第一个uiscrollview
(uitableview
也是uiscrollerview
)自动加bar
的insets
(一般为64
,下面都以64
来说,但有些情况下不是64
,比如接电话时,是84
)
所以一般情况下使用navigationController时不用特别处理navigationController的高度问题,因为会自动把视图往下移动64。
解决方案:
设置automaticallyAdjustsScrollViewInsets
为no
即可,要注意,automaticallyAdjustsScrollViewInsets
是viewController
的不是navigationcontroller
的。
但是这样也不是最好的解决方案,因为你手动加64就只能是64,除非用大量代码判断,否则接电话、录音、连接个人热点等通知栏高度改变时界面会错位(可以在viewDidLayoutSubviews
中重新设置偏移)
好的办法应该是用autolayout
,并且不设置偏移(顶部到顶),然后在viewDidLoad
中设置self.edgesForExtendedLayout=UIRectEdgeNone
这样设置的作用是让controller
绘制视图时不要将顶部通知栏、导航栏和底部toolbar
等的高度计算在contentview
中,所以这样设置之后就可以不设置tableview
的偏移也可以显示正常,然后使用autolayout
的目的是为了界面重载时(如切换打电话状态)也能重新调整界面。
不想研究,就想马上解决问题
如果你想立刻解决这个问题,直接在ViewController中加入如下代码:
self.automaticallyAdjustsScrollViewInsets = false;