如何将UITableView的contentOffset固定为0?解决其偏移至(0, -64)的问题
解决UITableView contentOffset 自动变为(0, -64)的问题
这个问题本质是iOS系统默认的滚动视图内边距自动调整在起作用——因为你的导航栏是透明的,系统会自动偏移tableView的内容,让它从导航栏下方开始展示,所以才会出现(0, -64)的偏移值。下面给你几个实用的解决思路,根据你的iOS版本和项目需求选就行:
方法一:禁用视图控制器的自动调整属性(iOS 11之前常用)
在视图控制器的viewDidLoad或者初始化逻辑里,加上这行代码:
self.automaticallyAdjustsScrollViewInsets = false
如果用Objective-C的话就是:
self.automaticallyAdjustsScrollViewInsets = NO;
这个属性会告诉系统:别自动调整scrollView(包括UITableView)的内边距和偏移量,tableView就能从你预期的位置开始布局了。
方法二:设置tableView的contentInsetAdjustmentBehavior(iOS 11及以后推荐)
iOS 11之后,上面的属性被废弃了,取而代之的是scrollView的专属属性。直接给tableView设置这个就行:
tableView.contentInsetAdjustmentBehavior = .never
Objective-C版本:
tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
这个设置会彻底禁用系统对tableView内边距的自动调整,不管导航栏状态如何,tableView的contentOffset都会保持默认的(0,0)。
方法三:调整导航栏的translucent属性(可选,视UI需求而定)
如果你的导航栏虽然透明,但可以接受关闭半透明效果,也可以试试这个:
navigationController?.navigationBar.isTranslucent = false
Objective-C:
self.navigationController.navigationBar.translucent = NO;
当导航栏不透明时,系统会自动让tableView从导航栏底部开始布局,不会出现向上偏移的情况。不过这个方法会改变导航栏的视觉表现,需要结合你的UI设计来决定是否使用。
额外小提示:检查tableView的约束
有时候如果tableView的顶部约束绑定了topLayoutGuide或者safeAreaLayoutGuide,也可能导致偏移。确保tableView的顶部约束是直接和父视图顶部对齐,而不是和安全区域/布局指南对齐,也能避免这类自动调整问题。
内容的提问来源于stack exchange,提问作者Marina
相关产品推荐
相关产品推荐

