fix IndexMain
This commit is contained in:
parent
d00703f8c5
commit
f1bda5455f
@ -28,6 +28,9 @@ struct IndexMainView: View {
|
||||
@State private var footerRefreshing: Bool = false
|
||||
@State private var noMore: Bool = false
|
||||
|
||||
// 控制显示区域的可见性
|
||||
@State private var visibleIndices = Set<Int>()
|
||||
|
||||
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<Int>
|
||||
|
||||
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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user