You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS设备旋转时ScrollView内TableView数据消失问题求助

解决iOS旋转时ScrollView内TableView数据消失的问题

核心问题分析

设备旋转时AutoLayout会重新计算布局,嵌套在ScrollView里的TableView容易出现高度约束异常、数据源未正确绑定的情况,最终导致数据显示消失。

具体修复步骤

  1. 旋转时强制刷新数据源与布局
    重写viewWillTransition(to:with:)方法,在旋转过程中同步刷新TableView并调整高度:

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        coordinator.animate(alongsideTransition: { _ in
            // 刷新当前Segment对应的数据源
            self.movieListTableView.reloadData()
            // 重新计算并更新TableView高度
            self.updateTableViewHeight()
        })
    }
    
  2. 修正TableView高度更新逻辑
    不要在viewDidLayoutSubviews中直接修改ScrollView高度(该方法会被频繁调用,易引发循环布局),单独封装高度更新方法:

    func updateTableViewHeight() {
        // 先让TableView完成当前布局,确保contentSize准确
        movieListTableView.layoutIfNeeded()
        // 更新TableView的高度约束
        tableViewHeightConstraint.constant = movieListTableView.contentSize.height
        // 让ScrollView重新适配内容高度
        scrollview.layoutIfNeeded()
    }
    

    注意:每次切换Segment获取到新的电影数组后,也要调用这个方法更新高度。

  3. 检查ScrollView的约束完整性
    确保ScrollView的约束设置没有漏洞:

    • ScrollView的上下左右四边与父视图(或安全区)严格对齐
    • 如果使用了ContentView作为ScrollView的子容器,需让ContentView的上下左右与ScrollView对齐,同时ContentView的宽度等于父视图宽度(避免横向滚动,保证旋转时宽度适配)
    • TableView的约束需绑定到ContentView,而非直接绑定ScrollView
  4. 关闭系统自动调整内边距
    在viewDidLoad中添加以下设置,防止系统自动调整TableView内边距导致高度计算错误:

    movieListTableView.automaticallyAdjustsScrollIndicatorInsets = false
    movieListTableView.contentInsetAdjustmentBehavior = .never
    

额外排查点

  • 确认存储电影数组的变量是实例变量,而非局部变量,避免旋转时数据源被意外清空
  • 检查API请求的回调是否在主线程执行,确保UI更新操作都在主线程完成

内容的提问来源于stack exchange,提问作者Mahmoud Arafat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:00:47