add index view
This commit is contained in:
parent
edea9ff225
commit
8240aa9927
@ -404,6 +404,7 @@
|
|||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@ -433,6 +434,7 @@
|
|||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
|
|||||||
@ -1,61 +0,0 @@
|
|||||||
//
|
|
||||||
// ContentView.swift
|
|
||||||
// dimensionhub
|
|
||||||
//
|
|
||||||
// Created by 安礼成 on 2025/2/18.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftData
|
|
||||||
|
|
||||||
struct ContentView: View {
|
|
||||||
@Environment(\.modelContext) private var modelContext
|
|
||||||
@Query private var items: [Item]
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
NavigationSplitView {
|
|
||||||
List {
|
|
||||||
ForEach(items) { item in
|
|
||||||
NavigationLink {
|
|
||||||
Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))")
|
|
||||||
} label: {
|
|
||||||
Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.onDelete(perform: deleteItems)
|
|
||||||
}
|
|
||||||
.toolbar {
|
|
||||||
ToolbarItem(placement: .navigationBarTrailing) {
|
|
||||||
EditButton()
|
|
||||||
}
|
|
||||||
ToolbarItem {
|
|
||||||
Button(action: addItem) {
|
|
||||||
Label("Add Item", systemImage: "plus")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} detail: {
|
|
||||||
Text("Select an item")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func addItem() {
|
|
||||||
withAnimation {
|
|
||||||
let newItem = Item(timestamp: Date())
|
|
||||||
modelContext.insert(newItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func deleteItems(offsets: IndexSet) {
|
|
||||||
withAnimation {
|
|
||||||
for index in offsets {
|
|
||||||
modelContext.delete(items[index])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#Preview {
|
|
||||||
ContentView()
|
|
||||||
.modelContainer(for: Item.self, inMemory: true)
|
|
||||||
}
|
|
||||||
242
dimensionhub/IndexView.swift
Normal file
242
dimensionhub/IndexView.swift
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
//
|
||||||
|
// ContentView.swift
|
||||||
|
// dimensionhub
|
||||||
|
//
|
||||||
|
// Created by 安礼成 on 2025/2/18.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import SwiftData
|
||||||
|
|
||||||
|
let url: String = "https://n.sinaimg.cn/sinacn10113/332/w1024h1708/20190806/73d1-iatixpm8624905.jpg"
|
||||||
|
|
||||||
|
struct IndexView: View {
|
||||||
|
@Environment(\.modelContext) private var modelContext
|
||||||
|
@Query private var items: [Item]
|
||||||
|
|
||||||
|
struct DramaItem: Codable {
|
||||||
|
struct Episode: Codable {
|
||||||
|
let id: Int32
|
||||||
|
let name: String
|
||||||
|
let thumb: String
|
||||||
|
let numName: String
|
||||||
|
}
|
||||||
|
|
||||||
|
let title: String
|
||||||
|
let episodes: [Episode]
|
||||||
|
}
|
||||||
|
|
||||||
|
struct UpdateDramaItem: Codable {
|
||||||
|
let name: String
|
||||||
|
let thumb: String
|
||||||
|
let desc: String
|
||||||
|
let datetime: String
|
||||||
|
}
|
||||||
|
|
||||||
|
@State var dramas: [DramaItem] = [
|
||||||
|
.init(title: "夏目友人帐 陆", episodes: [
|
||||||
|
.init(id: 1, name: "西村与北本", thumb: url, numName: "第6话"),
|
||||||
|
.init(id: 2, name: "西村与北本", thumb: url, numName: "第5话"),
|
||||||
|
.init(id: 3, name: "西村与北本", thumb: url, numName: "第4话"),
|
||||||
|
.init(id: 4, name: "西村与北本", thumb: url, numName: "第4话"),
|
||||||
|
.init(id: 5, name: "西村与北本", thumb: url, numName: "第4话"),
|
||||||
|
]),
|
||||||
|
|
||||||
|
.init(title: "吹响吧! 上低音号", episodes: [
|
||||||
|
.init(id: 1, name: "欢迎进入高中", thumb: url, numName: "第6话"),
|
||||||
|
.init(id: 2, name: "拜托了上低音...", thumb: url, numName: "第5话"),
|
||||||
|
.init(id: 3, name: "吹奏乐部活动...", thumb: url, numName: "第4话"),
|
||||||
|
.init(id: 4, name: "吹奏乐部活动...", thumb: url, numName: "第4话"),
|
||||||
|
.init(id: 5, name: "吹奏乐部活动...", thumb: url, numName: "第4话"),
|
||||||
|
])
|
||||||
|
]
|
||||||
|
|
||||||
|
let updateDramas: [UpdateDramaItem] = [
|
||||||
|
.init(name: "拜托了上", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上1", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上2", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上3", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上4", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上5", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"),
|
||||||
|
.init(name: "拜托了上6", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"),
|
||||||
|
]
|
||||||
|
|
||||||
|
enum UpdateDramaShowItem {
|
||||||
|
case lable(String)
|
||||||
|
case item(UpdateDramaItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
@State var showUpdateDramas: [UpdateDramaShowItem] = Self.yes(updateDramas: [
|
||||||
|
.init(name: "拜托了上", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上1", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上2", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上3", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上4", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
|
||||||
|
.init(name: "拜托了上5", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"),
|
||||||
|
.init(name: "拜托了上6", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"),
|
||||||
|
])
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(alignment: .center) {
|
||||||
|
HStack(alignment: .center) {
|
||||||
|
Spacer()
|
||||||
|
Text("亚次元")
|
||||||
|
.padding(.top, 5)
|
||||||
|
.padding(.bottom, 5)
|
||||||
|
Spacer()
|
||||||
|
}
|
||||||
|
.background(Color.red)
|
||||||
|
|
||||||
|
HStack(alignment: .center) {
|
||||||
|
Spacer()
|
||||||
|
Text("番剧补完计划")
|
||||||
|
.font(.system(size: 24))
|
||||||
|
}
|
||||||
|
|
||||||
|
ForEach(dramas.indices, id: \.self) { id in
|
||||||
|
DramaCellView(dramaItem: dramas[id])
|
||||||
|
}
|
||||||
|
|
||||||
|
// 基于日期的更新列表
|
||||||
|
ScrollView(.vertical, showsIndicators: false) {
|
||||||
|
LazyVStack {
|
||||||
|
ForEach(showUpdateDramas.indices, id: \.self) { index in
|
||||||
|
UpdateDramaCellView(showItem: showUpdateDramas[index])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.background(GeometryReader { geometry in
|
||||||
|
Color.clear.onChange(of: geometry.frame(in: .global).minY) {_, offset in
|
||||||
|
let contentHeight = geometry.size.height
|
||||||
|
let scrollViewHeight = UIScreen.main.bounds.height
|
||||||
|
|
||||||
|
// 判断是否滑动到底部
|
||||||
|
if offset + contentHeight > scrollViewHeight - 50 {
|
||||||
|
print("call me here11")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.task {
|
||||||
|
let groups = Dictionary(grouping: self.updateDramas) {$0.datetime}
|
||||||
|
var updateItems: [UpdateDramaShowItem] = []
|
||||||
|
groups.forEach { (key, items) in
|
||||||
|
updateItems.append(.lable(key))
|
||||||
|
items.forEach { item in
|
||||||
|
updateItems.append(.item(item))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.showUpdateDramas = updateItems
|
||||||
|
NSLog("call me heere 11")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private func addItem() {
|
||||||
|
withAnimation {
|
||||||
|
let newItem = Item(timestamp: Date())
|
||||||
|
modelContext.insert(newItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func deleteItems(offsets: IndexSet) {
|
||||||
|
withAnimation {
|
||||||
|
for index in offsets {
|
||||||
|
modelContext.delete(items[index])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static func yes(updateDramas: [UpdateDramaItem]) -> [UpdateDramaShowItem] {
|
||||||
|
let groups = Dictionary(grouping: updateDramas) {$0.datetime}
|
||||||
|
var updateItems: [UpdateDramaShowItem] = []
|
||||||
|
groups.forEach { (key, items) in
|
||||||
|
updateItems.append(.lable(key))
|
||||||
|
items.forEach { item in
|
||||||
|
updateItems.append(.item(item))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return updateItems
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension IndexView {
|
||||||
|
|
||||||
|
// 显示剧集的列表信息
|
||||||
|
struct DramaCellView: View {
|
||||||
|
let dramaItem: DramaItem
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(alignment: .leading) {
|
||||||
|
Text(dramaItem.title)
|
||||||
|
.font(.system(size: 20))
|
||||||
|
|
||||||
|
ScrollView(.horizontal, showsIndicators: false) {
|
||||||
|
HStack(alignment: .center, spacing: 10) {
|
||||||
|
ForEach(dramaItem.episodes, id: \.id) { item in
|
||||||
|
VStack(alignment: .center) {
|
||||||
|
AsyncImage(url: URL(string: item.thumb)) { image in
|
||||||
|
image.resizable()
|
||||||
|
} placeholder: {
|
||||||
|
ProgressView()
|
||||||
|
}
|
||||||
|
.frame(width: 80, height: 80)
|
||||||
|
.overlay {
|
||||||
|
Text(item.numName)
|
||||||
|
}
|
||||||
|
|
||||||
|
Text(item.name)
|
||||||
|
.lineLimit(1)
|
||||||
|
}
|
||||||
|
.frame(width: 100, height: 120)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.border(Color.red)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension IndexView {
|
||||||
|
|
||||||
|
struct UpdateDramaCellView: View {
|
||||||
|
let showItem: UpdateDramaShowItem
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
|
||||||
|
switch showItem {
|
||||||
|
case .lable(let name):
|
||||||
|
Text(name)
|
||||||
|
case .item(let item):
|
||||||
|
VStack(alignment: .center) {
|
||||||
|
AsyncImage(url: URL(string: item.thumb)) { image in
|
||||||
|
image.resizable()
|
||||||
|
} placeholder: {
|
||||||
|
ProgressView()
|
||||||
|
}
|
||||||
|
.frame(width: 80, height: 80)
|
||||||
|
.overlay {
|
||||||
|
VStack(alignment: .leading) {
|
||||||
|
Text(item.name)
|
||||||
|
.lineLimit(1)
|
||||||
|
|
||||||
|
Text(item.desc)
|
||||||
|
.lineLimit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(width: 100, height: 120)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
IndexView()
|
||||||
|
.modelContainer(for: Item.self, inMemory: true)
|
||||||
|
}
|
||||||
@ -25,7 +25,7 @@ struct dimensionhubApp: App {
|
|||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup {
|
||||||
ContentView()
|
IndexView()
|
||||||
}
|
}
|
||||||
.modelContainer(sharedModelContainer)
|
.modelContainer(sharedModelContainer)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user