昨天突然发现了一个问题,table view每次点完其中的一个item后再返回,或者下拉刷新后,第一个item上都会出现一块儿空白。只有再次进入table view时才恢复正常。
google了好久,发现最常见的原因是设置:
self.automaticallyAdjustsScrollViewInsets = false // 取消自动内边距
但是我试过之后,发现这会导致tableview在一开始,第一行就被navigation bar遮盖住,显然不能解决遇到的问题。
然后发现有人说设置 edgesForExtendedLayout:
self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
然而并没有什么用。
而且,我发现,这个问题只在iOS 9.x出现,iOS 10.3上没有问题,显示正常。
我的table view很简单,没有什么多余的设置,只能一点点排查。我发现当我把UIRefreshController去掉后,就恢复正常,下拉和进入一个item再返回后都不会出现上部有空白的情况。而且仔细观察,这个空白的高度,与UIRefreshController的高度几乎相当,大于navigation bar的高度。因此,可以得出结论,我的这种出现空白的情况,与内边距无关,只是UIRefreshController导致的。
我对UIRefreshController的属性设置有:
self.refreshController?.backgroundColor = UIColor.red
self.refreshController?.tintColor = UIColor.green
self.refreshController?.attributedTitle = NSAttributedString.init(string: "下拉刷新列表")
现象如图所示:
点击(刷新)前:
点击(刷新)后:
刷新过程中:
我使用的是UITableViewController自带的UIRefreshController,在storyboard中通过Enabled Refreshing 开启刷新控件。唯一可疑的是设置attributedTitle的语句。删掉后tableview恢复正常,下拉刷新或者点选item返回后都不会出现空白。
google上有人说需要进行如下设置:
self.spinner.backgroundColor = UIColor.red
self.spinner.tintColor = UIColor.green
self.spinner.attributedTitle = NSAttributedString.init(string: "刷新下载列表")
self.tableView.addSubview(self.spinner)
self.tableView.sendSubview(toBack: self.spinner)
试过了,没有用,iOS 9.x上依然没改善。
但是,又想在下拉时写刷新提示语句,怎么做呢?正确的方式是在Storyboard的UITableViewController上enabled Refreshing,这时会自动在TableView Controller上创建一个RefreshControl(我这里已经将这个UIRefreshController连接进code,变量名为spinner,所以图中显示的是变量名),选中此refresh controller,在右侧Attribute Inspector上直接编辑想要显示的提示文字,如图所示:
修改后,在iOS 9.x上恢复正常,如图:
刷新过程:
table view 点击(刷新后):