请合理使用API(记录一个问题排查过程)
合理使用API很重要(记录一个问题排查过程)
前言
你永远不知道,可能是你随便添加的一行代码,对后续的开发造成了多大的麻烦,甚至上升到了怀疑原生设计者的bug。所以请谨慎添加代码,并且了解你添加代码之后的影响范围;如果是局部可控的那最好,如果是全局不可控的,我建议你最好别添加,因为别的地方的开发出现问题根本联想不到是你这里出现的问题,这真的是坑死后人。
起因
最近因为同事开发的下拉显示二楼架构不合理,导致出现必现且不改架构无法解决的问题,我来接手重新架构,保证架构的合理性、可维护性。
架构如何不合理,新架构又是如何架构,不是本次的重点,就不再这里赘述。
这次主要一下,之后出现的奇怪现象。
当下滑到某个位置后松手,需要整个tableView做个动画向下位移,移出屏幕。展示背景view,且实现转场到二楼页面。
但是奇怪的事情就此发生了:
1. 当我去修改contentInset.top为screenHeight且 设置contentOffset 为(0, -screenHeight), 即滚动到屏幕下沿。莫名的会先达到最下沿,然后回弹一段距离。
2.当个人中心的页面切回首页后,tableView 会自动调整 contentInset 顶部增加44, 底部增加一段距离
3.不同设备首次进入首页,会自动向下便宜44的距离
排查
-
首先想到的是:是不是其他地方设置contentOffset或者contentInset
问题1之后的所有设置contentInset和contentOffset的地方,并没有发现有任何异样
-
然后通过以上排查,那么肯定就是tableView 主动调整了自己的contentInset
那么首先想到的是,限制scrollView主动调整inset的属性,contentInsetAdjustmentBehavior 发现也设置为了never, 那么没有理由会自动调整啊,难道是tableView出现了系统性的bug?
-
开始各种网上搜这类型的bug,基本上都是忘记设置contentInsetAdjustmentBehavior为never导致的,但是我们设置了啊?
破迷
难道真的是tableView的bug?难道说是contentInsetAdjustmentBehavior 失效了?
OK,那么我在viewWillAppear里重新设置下:
public override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.contentInsetAdjustmentBehavior = .never
}
奇迹发生了,没问题了。
难道说真的是系统出现问题了?系统会再次进入的时候打开了自动调整contentInset?说不通啊,要是这样的话那么早有问题了
我仔细回想了,前前后后发生的现象,问题2-个人中心tab切回首页Tab,会出现自动便宜,那么他们之间又有什么关系呢?
会不是首页不知道的地方打开了contentInsetAdjustmentBehavior?
全局搜一下?一搜谜团终于解开了:
在个人中心的页面发现了一行代码
- (void)setupUI {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
...
}
OMG? 怎么能在这全局打开自动调整contentInset的属性呢?
好了,谜团解开了,前人挖坑后人填,在个人中心里添加了全局修改scrollView的contentInsetAdjustmentBehavior 为自动调整,
首页是比个人中心加载快的,也就是说,当首页将自己的tableView设置为never后,在个人中心页面加载的时候将全局设置为auto,相当于重新打开,那tableView不自动调整才怪...
结语
我思前想后,前人在这加这个的动机是什么?如果你想全局设置也不应该在这,最起码得在最显眼的地方比如AppDelegate,但是我不建议设置。那么我觉得只有一种动机,他刚好在哪看到了这个API,觉得很新颖,尝试一下,并没有了解他背后的影响力是全局的。所以奉劝一些不太成熟的开发者,不光使用API,最好是了解其背后的含义以及影响,你偶尔增加的一行代码,会给后续的开发者带来极大痛苦。