From 39333e5fd8b34e279334e6920112bcc9386ebcd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=89=E7=A7=8B?= <497055328@qq.com> Date: Mon, 6 Jul 2026 11:49:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=9B=B8=E6=9C=BA=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=AF=BC=E5=85=A5=E9=A1=B5=E7=BD=91=E6=A0=BC=E7=BC=A9?= =?UTF-8?q?=E7=95=A5=E5=9B=BE=E9=87=8D=E5=8F=A0=E4=B8=8E=E6=BA=A2=E5=87=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 采用 1:1 方形容器约束单元格布局,并统一网格间距与边距常量。 Co-authored-by: Cursor --- .../CameraHistoryImportDesign.swift | 11 +++ .../CameraHistoryImportPhotoCell.swift | 92 ++++++++++--------- .../CameraHistoryImportSectionHeader.swift | 3 +- .../CameraHistoryImportView.swift | 14 ++- 4 files changed, 75 insertions(+), 45 deletions(-) create mode 100644 suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportDesign.swift diff --git a/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportDesign.swift b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportDesign.swift new file mode 100644 index 0000000..bf219f9 --- /dev/null +++ b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportDesign.swift @@ -0,0 +1,11 @@ +import SwiftUI + +/// 相机历史导入页布局常量。 +enum CameraHistoryImportDesign { + static let gridColumns = 3 + static let gridHorizontalSpacing: CGFloat = 2 + static let gridVerticalSpacing: CGFloat = 2 + static let contentHorizontalPadding: CGFloat = 12 + static let sectionSpacing: CGFloat = 12 + static let thumbnailCornerRadius: CGFloat = 4 +} diff --git a/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportPhotoCell.swift b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportPhotoCell.swift index 9879e75..555d54d 100644 --- a/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportPhotoCell.swift +++ b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportPhotoCell.swift @@ -11,51 +11,61 @@ struct CameraHistoryImportPhotoCell: View { @State private var thumbnail: UIImage? var body: some View { - ZStack(alignment: .topTrailing) { - Group { - if let thumbnail { - Image(uiImage: thumbnail) - .resizable() - .scaledToFill() - } else { - Color.gray.opacity(0.15) - .overlay { - ProgressView() - .scaleEffect(0.7) - } + Color.clear + .aspectRatio(1, contentMode: .fit) + .overlay { + thumbnailContent + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + .clipShape(RoundedRectangle(cornerRadius: CameraHistoryImportDesign.thumbnailCornerRadius)) + .overlay(alignment: .topTrailing) { + statusBadge + } + .contentShape(Rectangle()) + .onTapGesture { + guard !isImported else { return } + onToggle() + } + .task(id: photo.id) { + guard thumbnail == nil else { return } + if let data = await thumbnailProvider(), let image = UIImage(data: data) { + thumbnail = image } } - .frame(maxWidth: .infinity) - .aspectRatio(1, contentMode: .fit) - .clipped() + } - if isImported { - Text("已导入") - .font(.system(size: 10, weight: .medium)) - .foregroundStyle(.white) - .padding(.horizontal, 6) - .padding(.vertical, 3) - .background(Color.black.opacity(0.55)) - .clipShape(RoundedRectangle(cornerRadius: 4)) - .padding(6) - } else { - Image(systemName: isSelected ? "checkmark.circle.fill" : "circle") - .font(.system(size: 22)) - .foregroundStyle(isSelected ? AppDesign.primary : .white) - .shadow(radius: 2) - .padding(6) - } + @ViewBuilder + private var thumbnailContent: some View { + if let thumbnail { + Image(uiImage: thumbnail) + .resizable() + .scaledToFill() + } else { + Color.gray.opacity(0.15) + .overlay { + ProgressView() + .scaleEffect(0.7) + } } - .contentShape(Rectangle()) - .onTapGesture { - guard !isImported else { return } - onToggle() - } - .task(id: photo.id) { - guard thumbnail == nil else { return } - if let data = await thumbnailProvider(), let image = UIImage(data: data) { - thumbnail = image - } + } + + @ViewBuilder + private var statusBadge: some View { + if isImported { + Text("已导入") + .font(.system(size: 10, weight: .medium)) + .foregroundStyle(.white) + .padding(.horizontal, 6) + .padding(.vertical, 3) + .background(Color.black.opacity(0.55)) + .clipShape(RoundedRectangle(cornerRadius: 4)) + .padding(6) + } else { + Image(systemName: isSelected ? "checkmark.circle.fill" : "circle") + .font(.system(size: 22)) + .foregroundStyle(isSelected ? AppDesign.primary : .white) + .shadow(color: .black.opacity(0.35), radius: 2, x: 0, y: 1) + .padding(6) } } } diff --git a/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportSectionHeader.swift b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportSectionHeader.swift index b8a3979..54cb8d1 100644 --- a/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportSectionHeader.swift +++ b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportSectionHeader.swift @@ -21,8 +21,9 @@ struct CameraHistoryImportSectionHeader: View { .foregroundStyle(AppDesign.primary) } } - .padding(.horizontal, 12) + .padding(.horizontal, CameraHistoryImportDesign.contentHorizontalPadding) .padding(.vertical, 8) + .frame(maxWidth: .infinity, alignment: .leading) .background(WiredTransferDesign.pageBackground) } } diff --git a/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportView.swift b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportView.swift index ace26e4..481bd8a 100644 --- a/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportView.swift +++ b/suixinkan/Features/TravelAlbum/Views/CameraHistoryImport/CameraHistoryImportView.swift @@ -70,10 +70,10 @@ struct CameraHistoryImportView: View { private func photoList(sections: [CameraPhotoSection]) -> some View { ScrollView { - LazyVStack(spacing: 12, pinnedViews: [.sectionHeaders]) { + LazyVStack(spacing: CameraHistoryImportDesign.sectionSpacing, pinnedViews: [.sectionHeaders]) { ForEach(sections) { section in Section { - LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())], spacing: 2) { + LazyVGrid(columns: gridColumns, spacing: CameraHistoryImportDesign.gridVerticalSpacing) { ForEach(section.photos, id: \.id) { photo in CameraHistoryImportPhotoCell( photo: photo, @@ -94,10 +94,18 @@ struct CameraHistoryImportView: View { } } } - .padding(.horizontal, 2) + .padding(.horizontal, CameraHistoryImportDesign.contentHorizontalPadding) + .padding(.bottom, 16) } } + private var gridColumns: [GridItem] { + Array( + repeating: GridItem(.flexible(), spacing: CameraHistoryImportDesign.gridHorizontalSpacing), + count: CameraHistoryImportDesign.gridColumns + ) + } + private func emptyView(message: String) -> some View { VStack(spacing: 16) { Text(message)