最近遇到项目在iOS 11设备上UIViewController切换时TableView会异常的向下偏移,随着界面完全展示又回到正常的位置的文字。虽然只是那么一瞬间,但还是看着不舒服,即使测试没有提出来,我还是决定解决这个问题。
首先我们来重现这个问题,新建一个项目,只有两个控制器。
第一个控制器上一个背景为棕色的UITableView,选中一个cell的时候跳转第二个控制器。
第二个上有一个背景为绿色UIScrollView,UIScrollView上放着一个背景为黄色的UIView。
颜色很鲜艳吧,没错,我们年轻人就是喜欢这么花里胡哨的东西。
不是不是~ 是为了让大家能更加清楚的看到异常偏移的效果~
在我们不作任何设置的时候,跳转显示都是正常的,切换很流畅。
现在我们在第一个控制器的- (void)viewDidLoad 方法里加上这句代码再运行。
self.navigationController.navigationBar.translucent = NO;
无论是从第一个界面push到第一个界面还是从第二个界面pop到第一个界面都会出现TableView和ScrollerView异常偏移的问题。使用侧滑手势pop的时候最为明显。
模拟器都是用的iPhone X,前两张是用微信截图的,这张图片是在模拟器里 command + S 保存的,帅气的留海不见了~
重现了问题,接下来就是解决问题了。
我们一开始是正常的,直到加了
self.navigationController.navigationBar.translucent = NO;
才出现异常,所以当然和它有关系了(这不是废话吗~ /抠鼻 )
它是原因之一,还有一个就是应为iOS11中 UIScrollView 有了一个新的属性 contentInsetAdjustmentBehavior
/* Configure the behavior of adjustedContentInset. Default is UIScrollViewContentInsetAdjustmentAutomatic. */
@property(nonatomic)UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));
这是一个枚举,默认值是 UIScrollViewContentInsetAdjustmentAutomatic,各个枚举具体是什么意思呢? 看文档或者 www.baidu.com 。
UIScrollViewContentInsetAdjustmentAutomatic 会为我们计算安全区域 加上我们设置了 self.navigationController.navigationBar.translucent = NO ,出现了UIViewController切换时TableView异常偏移的问题。具体因为啥我也不知道~~~ 哪位大佬知道请告诉我。
如果我们将在第一个控制器中加入一下
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
我们UIViewController切换的时候又正常啦~ 不过会有一个小问题,关闭了安全区域的计算在iPhone X上有时候我们的按钮会在非安全区域内,用户不好点击,影响体验。
这个时候列表已经滑动到最底部了,没法在往上滑,再点击按钮。
当我们设置是默认的UIScrollViewContentInsetAdjustmentAutomatic 时,会是这样的
滑动到底部,会为我们空出安全区域。
所以我最终选择将translucent 修改为 YES,修复切换时的异常
self.navigationController.navigationBar.translucent = YES;
但是这也许会导致一些其他的问题~ translucent = YES 会改变 UIViewControlle 中View的Y轴起点。
二者选一吧