iOS10专属问题:PageViewController内的ViewController被TabBar遮挡
解决iOS10下PageViewController首次加载布局异常问题
这个问题我之前做iOS10适配时碰到过,核心原因是PageViewController首次初始化带ScrollView的子ViewController时,导航栏、TabBar的布局还没完全确定,导致ScrollView的contentInsets计算错误——要么顶部留了多余间隙,要么底部被TabBar遮挡,连带TextView也跟着超出屏幕。而滑动后子VC会触发重新布局,此时系统已经能正确获取栏的尺寸,布局就恢复正常了。
给你几个针对性的解决办法:
在子VC的
viewDidAppear中手动设置正确的内边距
这个时机下,导航栏和TabBar的布局已经完全稳定,能拿到准确的高度值。直接给ScrollView设置内边距,同时触发一次布局更新:override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 计算顶部内边距(状态栏+导航栏) let topInset = (navigationController?.navigationBar.frame.height ?? 0) + UIApplication.shared.statusBarFrame.height // 计算底部内边距(TabBar高度) let bottomInset = tabBarController?.tabBar.frame.height ?? 0 // 应用到ScrollView scrollView.contentInset = UIEdgeInsets(top: topInset, left: 0, bottom: bottomInset, right: 0) scrollView.scrollIndicatorInsets = scrollView.contentInset // 强制刷新布局 scrollView.layoutIfNeeded() }如果是Objective-C版本:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; CGFloat topInset = self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height; CGFloat bottomInset = self.tabBarController.tabBar.frame.size.height; self.scrollView.contentInset = UIEdgeInsetsMake(topInset, 0, bottomInset, 0); self.scrollView.scrollIndicatorInsets = self.scrollView.contentInset; [self.scrollView layoutIfNeeded]; }在PageViewController中手动触发第一个子VC的布局
当PageViewController设置完第一个子VC后,立刻调用子VC视图的layoutIfNeeded,强制系统重新计算布局:override func viewDidLoad() { super.viewDidLoad() // 初始化你的第一个图片ViewController let firstImageVC = YourImageViewController() setViewControllers([firstImageVC], direction: .forward, animated: false) { finished in // 手动触发布局,修正首次加载的偏差 firstImageVC.view.layoutIfNeeded() } }关闭自动调整ScrollView内边距的属性
iOS10中automaticallyAdjustsScrollViewInsets默认是开启的,系统会自动给ScrollView加内边距,但首次加载时这个计算可能出错。可以在子VC的viewDidLoad中关闭它,完全由我们手动控制内边距:override func viewDidLoad() { super.viewDidLoad() // 关闭系统自动调整内边距 automaticallyAdjustsScrollViewInsets = false }
这几个方法都能解决iOS10首次加载的布局问题,你可以根据自己的代码结构选择最合适的方案。
内容的提问来源于stack exchange,提问作者Max Power
相关产品推荐
相关产品推荐

