//视图控制器
UITableView *tv=[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
电视.delegate=self;
电视.dataSource=self;
[self.view addSubview:tv];vc.bouns 没有navbar.png 没有NavBar,什么都不设置,最简单的情况。左边是iOS 8,右边是iOS 11。发现iOS 8没有下移,iOS 11有20像素的下移。
在iOS 11 中,决定tableView 的内容和边缘之间的距离的是adjustmentContentInset 属性。
在iOS 11中,出现了安全区域的新概念。由于顶部有状态栏,系统自动计算tv.adjustedContentInset 值为{20, 0, 0, 0}。这会导致电视向下移动20 像素。
二
//应用委托
self.window.rootViewController=[[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
//视图控制器
UITableView *tv=[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
电视.delegate=self;
电视.dataSource=self;
[self.view addSubview:tv];vc.bouns 有navbar.png
两者都向下偏移64 像素。
在iOS 11 下,控制器具有automaticAdjustsScrollViewInsets 属性,默认为YES。 @property(nonatomic,assign) BOOL 自动调整ScrollViewInsets
API_DEPRECATED("使用UIScrollView 的contentInsetAdjustmentBehavior 代替", ios(7.0,11.0),tvos(7.0,11.0)); //默认为YES 当该属性设置为YES 时,系统将自动向下偏移电视。
在iOS 11中,可以看到automaticallyAdjustsScrollViewInsets属性被废弃了,但是为什么还是向下偏移了64像素。原因是一样的。当前的安全区域已经变成了NavBar下方,tv.adjustedContentInset也改为了{64,0,0,0},所以也向下偏移了64。
三
//应用委托
self.window.rootViewController=[[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
//视图控制器
UITableView *tv=[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
电视.delegate=self;
电视.dataSource=self;
[self.view addSubview:tv];
self.automaticallyAdjustsScrollViewInsets=NO;vc.bouns 与导航栏自动AdjustsScrollViewInsets=NO.png
三是二的反例。设置self.automaticallyAdjustsScrollViewInsets=NO;iOS 11以下不会偏移。
四
//应用程序委托
self.window.rootViewController=[[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
//视图控制器
self.tv=[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tv.delegate=self;
self.tv.dataSource=self;
[self.view addSubview:self.tv];
如果(@可用(iOS 11.0,*)){
self.tv.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;
} 别的{
self.automaticallyAdjustsScrollViewInsets=NO;
}vc.bouns has navbarautomaticAdjustsScrollViewInsets=NO UIScrollViewContentInsetAdjustmentNever.png 通过将tv.contentInsetAdjustmentBehavior 设置为UIScrollViewContentInsetAdjustmentNever,可以阻止系统计算adjustmentContentInset 值。结果,电视不再偏移。
五
//应用委托
self.window.rootViewController=[[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
//视图控制器
self.navigationController.navigationBar.hidden=YES;
self.view.backgroundColor=[UIColor 黄色颜色];
self.tv=[[UITableView 分配] initWithFrame:CGRectMake(0, 64, self.view.bounds.size.width, self.view.bounds.size.height - 64) style:UITableViewStylePlain];
self.tv.delegate=self;
self.tv.dataSource=self;
[self.view addSubview:self.tv];y=64 隐藏NavBar.png
有时您需要自定义导航控制器。在这种情况下,您需要隐藏内置导航栏。发现在iOS 11以下的系统中,电视仍然会偏移20个像素。 iOS 11 没有问题。
解决办法仍然是将automaticAdjustsScrollViewInsets设置为NO。
iOS 11之前的 automaticallyAdjustsScrollViewInsets
我觉得这个房产很有趣。
1 无NavBar
当没有设置NavigationController时,即NavBar不存在时,该属性不会发挥作用,tv不会出现偏移问题。
2 有NavBar
2.1 显示NavBar
设置NavigationController 时,导航栏不会隐藏,默认会向下偏移64 像素。而且无论您的导航栏是否挡住了电视,它都会发生偏移。下图tv.y=64
tv,y=64.png
2.2 不显示NavBar
当设置NavigationController并且隐藏NavBar时,默认会向下偏移20像素。并且和2.1一致,无论电视边框是什么,都会有偏移。下图tv.y=64
tv,y=64 Hide NavBar.png
如果你嫌这个属性麻烦,就设为NO,然后手动管理tv的frame。
总结
经过上面的实验,我个人认为有更好的方法来解决UIScrollView偏移问题。只需在代码中添加如下代码即可:
如果(@可用(iOS 11.0,*)){
self.tv.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;
} 别的{
self.automaticallyAdjustsScrollViewInsets=NO;
【iPhone iOS11升级适配:详解UITableView偏移问题解决方案】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
真希望官方能尽快解决这个 UITableView 的偏移问题!
有18位网友表示赞同!
我升级到 iOS11 后好多 App 都出现表格内容显示错误,真是太烦人了...
有9位网友表示赞同!
还在寻找解决方案,不知道有没有更靠谱的做法?
有20位网友表示赞同!
看了一下代码,好像 iOS 11 对 UITableView 的布局算法有所调整了。
有10位网友表示赞同!
好想看看具体是哪里的适配问题,能不能分享一下相关的代码片段?
有16位网友表示赞同!
我遇到了同样的问题,希望这个记录能给我一些启示!
有20位网友表示赞同!
升级到 iOS 11 后很多 App 都出现了这个问题,是不是更新太仓促了?
有8位网友表示赞同!
以前没遇到过这种偏移,真是让人头痛。
有14位网友表示赞同!
iOS 11 对 UI 设计要求又提高了一级?!
有18位网友表示赞同!
如果能找到解决办法,那简直是福音啊!
有12位网友表示赞同!
不知道其他开发者有没有遇到类似问题?
有20位网友表示赞同!
这篇文章很有帮助,让我对 iOS 11 的表格适配有了更深入的理解。
有17位网友表示赞同!
我得赶紧去看一下自己的 App 代码了,看看有没有需要注意的地方。
有13位网友表示赞同!
iOS 开发越来越难了,需要花更多的时间来调试和优化!
有6位网友表示赞同!
希望以后苹果能改进 iOS 更新策略,减少这类问题发生.
有6位网友表示赞同!
这个记录太棒了! 可以帮我加速解决我的表格适配问题!
有17位网友表示赞同!