如图所示:
解决方法(直接复制拷贝)
转自:http://blog.youkuaiyun.com/ycm1101743158/article/details/78086152
1. 重新设置tableView的contentInset值,来抵消掉SafeAreaInset值,因为内容下移偏移量 = contentInset + SafeAreaInset;
如果之前自己设置了contentInset
值为(64,0,0,0),现在系统又设置了SafeAreaInsets
值为(64,0,0,0),那么tableView内容下移了64pt,这种情况下,可以设置contentInset
值为(0,0,0,0),也就是遵从系统的设置了。
2. 设置tableView的contentInsetAdjustmentBehavior属性
如果不需要系统为你设置边缘距离,可以做以下设置:
//如果iOS的系统是11.0,会有这样一个宏定义“#define __IPHONE_11_0 110000”;如果系统版本低于11.0则没有这个宏定义
#ifdef __IPHONE_11_0
if ([tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
#endif
contentInsetAdjustmentBehavior
属性也是用来取代automaticallyAdjustsScrollViewInsets
属性的,推荐使用这种方式。
3. 通过设置iOS 11新增的属性addtionalSafeAreaInset;
iOS 11之前,大家是通过将Controller的automaticallyAdjustsScrollViewInsets
属性设置为NO,来禁止系统对tableView调整contentInsets
的。如果还是想从Controller级别解决问题,那么可以通过设置Controller的additionalSafeAreaInsets
属性,如果SafeAreaInset
值为(20,0,0,0),那么设置additionalSafeAreaInsets
属性值为(-20,0,0,0),则SafeAreaInsets
不会对adjustedContentInset
值产生影响,tableView内容不会显示异常。这里需要注意的是addtionalSafeAreaInset
是Controller的属性,要知道SafeAreaInset
的值是由哪个Controller引起的,可能是由自己的Controller调整的,可能是navigationController调整的。是由哪个Controller调整的,则设置哪个Controller的addtionalSafeAreaInset
值来抵消掉SafeAreaInset
值。
我用的第二种方法
ps:要用第二种方法,tableView就要设置成plain而不是group如果是group那就只能修改代理方法,把viewForHeader和ViewForFooter设置为nil(前提是你的header和footer都没有用,如果本身就在header或者footer写了内容,就不需要改了,不会变形的)