From f1bda5455f9549ddb413716fbc9dc62f2130c7ee Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 9 Apr 2025 17:18:02 +0800 Subject: [PATCH] fix IndexMain --- dimensionhub/Views/Index/IndexMainView.swift | 115 +++++++++++-------- 1 file changed, 69 insertions(+), 46 deletions(-) diff --git a/dimensionhub/Views/Index/IndexMainView.swift b/dimensionhub/Views/Index/IndexMainView.swift index ef4ef01..cb8bc9a 100644 --- a/dimensionhub/Views/Index/IndexMainView.swift +++ b/dimensionhub/Views/Index/IndexMainView.swift @@ -28,6 +28,9 @@ struct IndexMainView: View { @State private var footerRefreshing: Bool = false @State private var noMore: Bool = false + // 控制显示区域的可见性 + @State private var visibleIndices = Set() + var body: some View { VStack(alignment: .center) { @@ -37,75 +40,72 @@ struct IndexMainView: View { .padding([.top, .bottom], 5) Spacer() - Button(action: { - appNavigation.append(dest: .followList) - }) { - HStack { - Text("♡ \(indexModel.follow_num)") - .font(.system(size: 17)) - .foregroundColor(.black) - .padding([.top, .bottom], 5) - .padding(.leading, 10) - } + HStack { + Text("♡ \(indexModel.follow_num)") + .font(.system(size: 17)) + .foregroundColor(.black) + .padding([.top, .bottom], 5) + .padding(.leading, 10) } .contentShape(Rectangle()) + .highPriorityGesture( + TapGesture().onEnded { + print("call me tap") + appNavigation.append(dest: .followList) + } + ) .zIndex(1) + .border(Color.red) } .padding([.leading, .trailing], 15) .frame(height: 50) .background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top) ScrollView(.vertical, showsIndicators: false) { - // 下拉刷新 - RefreshHeader(refreshing: $headerRefreshing, action: { - guard !self.showDateNavPopover else { - return - } - - Task { - // 上拉刷新功能 - self.headerRefreshing = true - await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .prev) - self.headerRefreshing = false - } - }) { progress in - ProgressView() - } - Rectangle() .frame(width: 0, height: 15) // 基于日期的更新列表 LazyVStack(alignment: .center, spacing: 10) { ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in - DramaGroupView(group: group, model: indexModel) { + DramaGroupView(visibleIndices: $visibleIndices, group: group, model: indexModel) { selectGroupId = group.group_id indexModel.selectedDate = group.group_id showDateNavPopover = true } + .contentShape(Rectangle()) } } - // 上滑刷新 - RefreshFooter(refreshing: $footerRefreshing, action: { - guard !self.showDateNavPopover else { - return - } - - Task { - self.footerRefreshing = true - await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next) - self.footerRefreshing = false - } - }) { - ProgressView() - } - .noMore(noMore) - .preload(offset: 50) +// // 上滑刷新 +// RefreshFooter(refreshing: $footerRefreshing, action: { +// guard !self.showDateNavPopover else { +// return +// } +// +// Task { +// self.footerRefreshing = true +// await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next) +// self.footerRefreshing = false +// } +// }) { +// ProgressView() +// } +// .noMore(noMore) +// .preload(offset: 50) } - .enableRefresh() .frame(width: 370) .coordinateSpace(name: "indexScrollView") + .refreshable { + guard !self.showDateNavPopover && !self.headerRefreshing else { + return + } + + // 上拉刷新功能 + self.headerRefreshing = true + await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .prev) + self.headerRefreshing = false + } .overlay(alignment: .topTrailing) { HStack(alignment: .center) { Button(action: { @@ -151,6 +151,14 @@ struct IndexMainView: View { indexModel.setFixedDrameGroup(groupId: minFrame.key) } } + .onPreferenceChange(DramaOffsetPreferenceKey.self) { offsets in + self.visibleIndices = Set(offsets.compactMap { (id: Int, offset: CGFloat) in + return offset >= 0 ? id : nil + }) + + print("visible indx: \(self.visibleIndices)") + + } } } @@ -159,7 +167,8 @@ extension IndexMainView { // 显示分组信息 struct DramaGroupView: View { @EnvironmentObject var appNav: AppNavigation - + @Binding var visibleIndices: Set + let group: IndexModel.UpdateDramaGroup let model: IndexModel @@ -224,9 +233,13 @@ extension IndexMainView { let minY = geometry.frame(in: .named("indexScrollView")).minY let y = minY >= 0 ? minY : minY + height - Color.clear.preference(key: DramaGroupElementPreferenceKey.self, value: [ group.group_id : y]) + Color.clear + .preference(key: DramaGroupElementPreferenceKey.self, value: [ group.group_id : y]) + .preference(key: DramaOffsetPreferenceKey.self, value: [item.id : minY]) }) } + .allowsHitTesting(visibleIndices.contains(item.id)) + .disabled(!visibleIndices.contains(item.id)) } } } @@ -240,6 +253,16 @@ extension IndexMainView { value.merge(nextValue()) { $1 } } } + + // 元素的坐标的距离变化, [groupId : minY] + struct DramaOffsetPreferenceKey: PreferenceKey { + static var defaultValue: [Int: CGFloat] = [:] + + static func reduce(value: inout [Int: CGFloat], nextValue: () -> [Int: CGFloat]) { + value.merge(nextValue()) { $1 } + } + } + } #Preview {