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 footerRefreshing: Bool = false
|
||||||
@State private var noMore: Bool = false
|
@State private var noMore: Bool = false
|
||||||
|
|
||||||
|
// 控制显示区域的可见性
|
||||||
|
@State private var visibleIndices = Set<Int>()
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .center) {
|
VStack(alignment: .center) {
|
||||||
|
|
||||||
@ -37,75 +40,72 @@ struct IndexMainView: View {
|
|||||||
.padding([.top, .bottom], 5)
|
.padding([.top, .bottom], 5)
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
Button(action: {
|
HStack {
|
||||||
appNavigation.append(dest: .followList)
|
Text("♡ \(indexModel.follow_num)")
|
||||||
}) {
|
.font(.system(size: 17))
|
||||||
HStack {
|
.foregroundColor(.black)
|
||||||
Text("♡ \(indexModel.follow_num)")
|
.padding([.top, .bottom], 5)
|
||||||
.font(.system(size: 17))
|
.padding(.leading, 10)
|
||||||
.foregroundColor(.black)
|
|
||||||
.padding([.top, .bottom], 5)
|
|
||||||
.padding(.leading, 10)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.contentShape(Rectangle())
|
.contentShape(Rectangle())
|
||||||
|
.highPriorityGesture(
|
||||||
|
TapGesture().onEnded {
|
||||||
|
print("call me tap")
|
||||||
|
appNavigation.append(dest: .followList)
|
||||||
|
}
|
||||||
|
)
|
||||||
.zIndex(1)
|
.zIndex(1)
|
||||||
|
.border(Color.red)
|
||||||
}
|
}
|
||||||
.padding([.leading, .trailing], 15)
|
.padding([.leading, .trailing], 15)
|
||||||
.frame(height: 50)
|
.frame(height: 50)
|
||||||
.background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top)
|
.background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top)
|
||||||
|
|
||||||
ScrollView(.vertical, showsIndicators: false) {
|
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()
|
Rectangle()
|
||||||
.frame(width: 0, height: 15)
|
.frame(width: 0, height: 15)
|
||||||
|
|
||||||
// 基于日期的更新列表
|
// 基于日期的更新列表
|
||||||
LazyVStack(alignment: .center, spacing: 10) {
|
LazyVStack(alignment: .center, spacing: 10) {
|
||||||
ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in
|
ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in
|
||||||
DramaGroupView(group: group, model: indexModel) {
|
DramaGroupView(visibleIndices: $visibleIndices, group: group, model: indexModel) {
|
||||||
selectGroupId = group.group_id
|
selectGroupId = group.group_id
|
||||||
indexModel.selectedDate = group.group_id
|
indexModel.selectedDate = group.group_id
|
||||||
showDateNavPopover = true
|
showDateNavPopover = true
|
||||||
}
|
}
|
||||||
|
.contentShape(Rectangle())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 上滑刷新
|
// // 上滑刷新
|
||||||
RefreshFooter(refreshing: $footerRefreshing, action: {
|
// RefreshFooter(refreshing: $footerRefreshing, action: {
|
||||||
guard !self.showDateNavPopover else {
|
// guard !self.showDateNavPopover else {
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Task {
|
// Task {
|
||||||
self.footerRefreshing = true
|
// self.footerRefreshing = true
|
||||||
await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next)
|
// await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next)
|
||||||
self.footerRefreshing = false
|
// self.footerRefreshing = false
|
||||||
}
|
// }
|
||||||
}) {
|
// }) {
|
||||||
ProgressView()
|
// ProgressView()
|
||||||
}
|
// }
|
||||||
.noMore(noMore)
|
// .noMore(noMore)
|
||||||
.preload(offset: 50)
|
// .preload(offset: 50)
|
||||||
}
|
}
|
||||||
.enableRefresh()
|
|
||||||
.frame(width: 370)
|
.frame(width: 370)
|
||||||
.coordinateSpace(name: "indexScrollView")
|
.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) {
|
.overlay(alignment: .topTrailing) {
|
||||||
HStack(alignment: .center) {
|
HStack(alignment: .center) {
|
||||||
Button(action: {
|
Button(action: {
|
||||||
@ -151,6 +151,14 @@ struct IndexMainView: View {
|
|||||||
indexModel.setFixedDrameGroup(groupId: minFrame.key)
|
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 {
|
struct DramaGroupView: View {
|
||||||
@EnvironmentObject var appNav: AppNavigation
|
@EnvironmentObject var appNav: AppNavigation
|
||||||
|
@Binding var visibleIndices: Set<Int>
|
||||||
|
|
||||||
let group: IndexModel.UpdateDramaGroup
|
let group: IndexModel.UpdateDramaGroup
|
||||||
let model: IndexModel
|
let model: IndexModel
|
||||||
|
|
||||||
@ -224,9 +233,13 @@ extension IndexMainView {
|
|||||||
let minY = geometry.frame(in: .named("indexScrollView")).minY
|
let minY = geometry.frame(in: .named("indexScrollView")).minY
|
||||||
let y = minY >= 0 ? minY : minY + height
|
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 }
|
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 {
|
#Preview {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user