Swift4开发:iOS10下返回页面后TableView出现上下偏移问题求助
Hey there, fellow Swift 4 newbie! I’ve run into this exact weird TableView jump issue before on iOS 10 devices, so let’s break down why it’s happening and how to fix it.
Why This Happens
The root cause boils down to a difference in how iOS 10 and iOS 11 handle scroll view insets:
- On iOS 10 and earlier, view controllers use the
automaticallyAdjustsScrollViewInsetsproperty (default istrue) to automatically tweak scroll view insets based on navigation bars, tab bars, or layout guides. Since you’ve reserved a custom top bar area, this automatic adjustment gets confused when navigating back, causing the TableView to jump up and down. - iOS 11 replaced this property with
UIScrollView.contentInsetAdjustmentBehavior, which has smarter default logic—hence why you don’t see the issue in the iOS 11 simulator.
Step-by-Step Fixes
1. Disable Automatic Inset Adjustment & Set Manual Insets
First, turn off the automatic inset adjustment for your view controller, then manually set the TableView’s insets to account for your custom top bar:
override func viewDidLoad() { super.viewDidLoad() // Disable automatic inset adjustment self.automaticallyAdjustsScrollViewInsets = false // Replace with your actual custom top bar height let customTopBarHeight: CGFloat = 60.0 tableView.contentInset = UIEdgeInsets(top: customTopBarHeight, left: 0, bottom: 0, right: 0) tableView.scrollIndicatorInsets = tableView.contentInset }
2. Verify TableView Constraints
Double-check your TableView’s constraints to ensure they’re tied correctly to your custom top bar, not the view controller’s default layout guides:
- Set the TableView’s top constraint to the bottom of your custom label bar instead of
topLayoutGuide.bottom. This avoids unexpected system-driven layout shifts when navigating back.
3. Preserve Content Offset (If Needed)
If the jump still lingers after the above steps, manually save and restore the TableView’s scroll position when navigating:
// Store the last scroll offset before leaving the view private var lastTableViewOffset: CGPoint = .zero override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) lastTableViewOffset = tableView.contentOffset } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Restore the offset without animation to prevent jumping tableView.setContentOffset(lastTableViewOffset, animated: false) }
Testing Tip
Since this issue only pops up on your iOS 10 iPhone SE (not the iOS 11 simulator), make sure to test directly on that physical device after applying the fixes—simulators can sometimes behave differently with layout logic.
内容的提问来源于stack exchange,提问作者CamiloR

