Skip to content

SwiftUI 刷新动画直接消失 #1628

@wsw-0906

Description

@wsw-0906

描述bug
查看视频,下拉刷新动画直接消失了
struct LibrarySongView: View {
@StateObject private var viewModel = LibrarySongViewModel()
@State private var scrollView: UIScrollView? // ✅ 保存 ScrollView 引用
@State private var currentPage: Int = 1 // ✅ 当前页码
var body: some View {
ScrollView{
LazyVStack (spacing: 1){
if let songList = viewModel.librarySongList{
ForEach(songList) { songInfo in
ExtractedView(songInfo: songInfo)
}
}
}
}
.introspect(
.scrollView,
on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18, .v26)
) { scrollView in
// ✅ 捕获 ScrollView,只配置一次

        // ✅ 关键设置
        if #available(iOS 11.0, *) {
            scrollView.contentInsetAdjustmentBehavior = .automatic
        }

        // ✅ 重置 contentInset,让系统自动计算
        scrollView.contentInset = UIEdgeInsets.zero

        configureMJRefresh(for: scrollView)
        self.scrollView = scrollView
    }
    .background(Color(hexString: "#F4F4F4"))
}

// ✅ 配置 MJRefresh
private func configureMJRefresh(for scrollView: UIScrollView) {
    // ✅ 下拉刷新
    let header = MJRefreshNormalHeader { [weak scrollView] in
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            scrollView?.mj_header?.endRefreshing()
        }

    }

    scrollView.mj_header = header

    // 上拉加载更多
    scrollView.mj_footer = MJRefreshAutoNormalFooter { [weak scrollView] in
        Task { @MainActor in
            print("⬇️ 上拉加载更多开始")
            currentPage += 1
            viewModel.getLibrarySongList(page: currentPage)
            // 根据实际数据判断是否还有更多
            if let list = viewModel.librarySongList, list.count >= 30 {  // 假设最多30条
                scrollView?.mj_footer?.endRefreshingWithNoMoreData()
            } else {
                await scrollView?.mj_footer?.endRefreshing()
            }
        }
    }
}

}

必现/偶发?
必现

怎么样重现这个bug

  1. 显示哪个页面
  2. 点击哪个位置
  3. 滚动到哪个位置
  4. 发生了什么错误

你期望的结果是什么?
我希望下拉刷新或者加载更多能够等待数据加载完成动画再消失

截图

2025-11-11.14.11.12.mp4

如果有必要的话,请上传几张截图

运行环境

  • iPhone6
  • iOS8.1
  • Xcode10

额外的
最好能提供出现bug的Demo

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions