Refactor ContentView to improve UI layout and user experience; replace existing components with a modern design featuring gradient backgrounds, enhanced navigation links for QR code creation, scanning, and history, while removing unused state management for scanned results.

main
v504 10 months ago
parent a58e0dddde
commit 076ba18859

@ -8,131 +8,173 @@
import SwiftUI
struct ContentView: View {
@StateObject private var languageManager = LanguageManager.shared
@State private var scannedResult: String?
var body: some View {
NavigationView {
VStack(spacing: 30) {
//
Image(systemName: "qrcode.viewfinder")
.font(.system(size: 100))
.foregroundColor(.blue)
//
Text("app_title".localized)
.font(.largeTitle)
.fontWeight(.bold)
.multilineTextAlignment(.center)
ZStack {
//
LinearGradient(
gradient: Gradient(colors: [
Color(.systemBackground),
Color(.systemGray6).opacity(0.3)
]),
startPoint: .top,
endPoint: .bottom
)
.ignoresSafeArea()
VStack(spacing: 24) {
//
VStack(spacing: 12) {
Text("QR Code Creator")
.font(.system(size: 34, weight: .bold, design: .rounded))
.foregroundColor(.primary)
//
Text("app_description".localized)
.font(.body)
Text("快速创建和扫描二维码")
.font(.system(size: 16, weight: .medium))
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal)
}
.padding(.top, 0)
//
VStack(spacing: 18) {
// -
NavigationLink(destination: CreateCodeView()) {
VStack(alignment: .leading, spacing: 20) {
HStack {
Image(systemName: "qrcode")
.font(.system(size: 32, weight: .bold))
.foregroundColor(.white)
Spacer()
// - NavigationLink
Image(systemName: "arrow.up.right")
.font(.system(size: 22, weight: .medium))
.foregroundColor(.white.opacity(0.8))
}
VStack(alignment: .leading, spacing: 12) {
Text("创建二维码")
.font(.system(size: 28, weight: .bold))
.foregroundColor(.white)
Text("生成文本、链接、WiFi、联系人等各种二维码")
.font(.system(size: 16))
.foregroundColor(.white.opacity(0.9))
.lineLimit(2)
}
}
.padding(24)
.frame(maxWidth: .infinity, minHeight: 160)
.background(
LinearGradient(
gradient: Gradient(colors: [
Color.purple,
Color.blue,
Color.purple.opacity(0.8)
]),
startPoint: .topLeading,
endPoint: .bottomTrailing
)
)
.cornerRadius(24)
.shadow(color: .purple.opacity(0.4), radius: 20, x: 0, y: 10)
}
.padding(.horizontal, 20)
// -
HStack(spacing: 14) {
//
NavigationLink(destination: ScannerView()) {
VStack(alignment: .leading, spacing: 12) {
HStack {
Image(systemName: "camera.fill")
Text("start_scanning".localized)
.font(.system(size: 22, weight: .medium))
.foregroundColor(.white)
Spacer()
}
.font(.title2)
VStack(alignment: .leading, spacing: 6) {
Text("扫描识别")
.font(.system(size: 16, weight: .bold))
.foregroundColor(.white)
.padding()
.frame(maxWidth: .infinity)
.background(Color.blue)
.cornerRadius(15)
Text("扫描二维码")
.font(.system(size: 13))
.foregroundColor(.white.opacity(0.9))
}
}
.padding(16)
.frame(maxWidth: .infinity, minHeight: 100)
.background(
LinearGradient(
gradient: Gradient(colors: [
Color.blue,
Color.blue.opacity(0.8)
]),
startPoint: .topLeading,
endPoint: .bottomTrailing
)
)
.cornerRadius(16)
.shadow(color: .blue.opacity(0.25), radius: 8, x: 0, y: 4)
}
.padding(.horizontal, 40)
//
//
NavigationLink(destination: HistoryView()) {
VStack(alignment: .leading, spacing: 12) {
HStack {
Image(systemName: "clock.arrow.circlepath")
Text("历史记录")
}
.font(.title3)
.font(.system(size: 22, weight: .medium))
.foregroundColor(.white)
.padding()
.frame(maxWidth: .infinity)
.background(Color.orange)
.cornerRadius(10)
}
.padding(.horizontal, 60)
//
Button(action: {
testLogging()
}) {
HStack {
Image(systemName: "doc.text.fill")
Text("测试日志系统")
}
.font(.title3)
.foregroundColor(.white)
.padding()
.frame(maxWidth: .infinity)
.background(Color.green)
.cornerRadius(10)
Spacer()
}
.padding(.horizontal, 60)
//
HStack {
Text("language".localized)
.font(.headline)
VStack(alignment: .leading, spacing: 6) {
Text("历史记录")
.font(.system(size: 16, weight: .bold))
.foregroundColor(.white)
Picker("language".localized, selection: $languageManager.currentLanguage) {
ForEach(Language.allCases, id: \.self) { language in
Text(language.displayName).tag(language)
Text("查看历史")
.font(.system(size: 13))
.foregroundColor(.white.opacity(0.9))
}
}
.pickerStyle(SegmentedPickerStyle())
.padding(16)
.frame(maxWidth: .infinity, minHeight: 100)
.background(
LinearGradient(
gradient: Gradient(colors: [
Color.orange,
Color.orange.opacity(0.8)
]),
startPoint: .topLeading,
endPoint: .bottomTrailing
)
)
.cornerRadius(16)
.shadow(color: .orange.opacity(0.25), radius: 8, x: 0, y: 4)
}
.padding(.horizontal, 40)
//
if let result = scannedResult {
VStack(spacing: 10) {
Text("scan_result".localized)
.font(.headline)
.foregroundColor(.green)
Text(result)
.font(.body)
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(10)
.multilineTextAlignment(.center)
}
.padding(.horizontal, 40)
.padding(.horizontal, 20)
}
Spacer()
Spacer(minLength: 0)
}
.padding()
.navigationTitle("MyQrCode")
.navigationBarTitleDisplayMode(.inline)
.padding(.top, 0)
}
.onReceive(NotificationCenter.default.publisher(for: .scannerDidScanCode)) { notification in
if let result = notification.object as? String {
scannedResult = result
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink(destination: SettingsView()) {
Image(systemName: "gearshape.fill")
.font(.system(size: 18, weight: .medium))
.foregroundColor(.primary)
}
}
.onAppear {
//
languageManager.currentLanguage = .english
}
}
private func testLogging() {
logDebug("这是一条调试日志", className: "ContentView")
logInfo("这是一条信息日志", className: "ContentView")
logWarning("这是一条警告日志", className: "ContentView")
logError("这是一条错误日志", className: "ContentView")
logSuccess("这是一条成功日志", className: "ContentView")
}
}

@ -0,0 +1,240 @@
import SwiftUI
struct SettingsView: View {
@StateObject private var languageManager = LanguageManager.shared
@Environment(\.dismiss) private var dismiss
var body: some View {
NavigationView {
ZStack {
//
LinearGradient(
gradient: Gradient(colors: [
Color(.systemBackground),
Color(.systemGray6).opacity(0.2)
]),
startPoint: .top,
endPoint: .bottom
)
.ignoresSafeArea()
ScrollView {
VStack(spacing: 24) {
//
VStack(spacing: 16) {
ZStack {
Circle()
.fill(
LinearGradient(
gradient: Gradient(colors: [
Color.blue.opacity(0.1),
Color.blue.opacity(0.05)
]),
startPoint: .topLeading,
endPoint: .bottomTrailing
)
)
.frame(width: 80, height: 80)
Image(systemName: "gearshape.fill")
.font(.system(size: 36, weight: .light))
.foregroundColor(.blue)
}
Text("设置")
.font(.system(size: 28, weight: .bold, design: .rounded))
.foregroundColor(.primary)
}
.padding(.top, 20)
//
VStack(alignment: .leading, spacing: 16) {
HStack {
Image(systemName: "globe")
.font(.system(size: 20, weight: .medium))
.foregroundColor(.blue)
.frame(width: 32)
VStack(alignment: .leading, spacing: 4) {
Text("语言设置")
.font(.system(size: 18, weight: .semibold))
Text("选择应用显示语言")
.font(.system(size: 14))
.foregroundColor(.secondary)
}
Spacer()
}
Picker("语言", selection: $languageManager.currentLanguage) {
ForEach(Language.allCases, id: \.self) { language in
Text(language.displayName).tag(language)
}
}
.pickerStyle(SegmentedPickerStyle())
}
.padding(20)
.background(
RoundedRectangle(cornerRadius: 16)
.fill(Color(.systemBackground))
.shadow(color: .black.opacity(0.05), radius: 8, x: 0, y: 2)
)
.padding(.horizontal, 20)
//
VStack(alignment: .leading, spacing: 16) {
HStack {
Image(systemName: "info.circle")
.font(.system(size: 20, weight: .medium))
.foregroundColor(.green)
.frame(width: 32)
Text("应用信息")
.font(.system(size: 18, weight: .semibold))
Spacer()
}
VStack(spacing: 12) {
HStack {
Text("版本")
.font(.system(size: 16))
.foregroundColor(.secondary)
Spacer()
Text("1.0.0")
.font(.system(size: 16, weight: .medium))
}
HStack {
Text("构建版本")
.font(.system(size: 16))
.foregroundColor(.secondary)
Spacer()
Text("1")
.font(.system(size: 16, weight: .medium))
}
}
}
.padding(20)
.background(
RoundedRectangle(cornerRadius: 16)
.fill(Color(.systemBackground))
.shadow(color: .black.opacity(0.05), radius: 8, x: 0, y: 2)
)
.padding(.horizontal, 20)
//
VStack(alignment: .leading, spacing: 16) {
HStack {
Image(systemName: "star.fill")
.font(.system(size: 20, weight: .medium))
.foregroundColor(.orange)
.frame(width: 32)
Text("功能特色")
.font(.system(size: 18, weight: .semibold))
Spacer()
}
VStack(spacing: 16) {
FeatureRow(
icon: "camera.fill",
iconColor: .blue,
title: "扫描功能",
description: "支持扫描二维码和条形码,自动识别类型并保存到历史记录"
)
FeatureRow(
icon: "plus.circle.fill",
iconColor: .green,
title: "创建功能",
description: "可以手动创建各种类型的二维码和条形码"
)
FeatureRow(
icon: "clock.arrow.circlepath",
iconColor: .orange,
title: "历史记录",
description: "自动保存所有扫描和创建的条码,支持收藏和管理"
)
}
}
.padding(20)
.background(
RoundedRectangle(cornerRadius: 16)
.fill(Color(.systemBackground))
.shadow(color: .black.opacity(0.05), radius: 8, x: 0, y: 2)
)
.padding(.horizontal, 20)
//
VStack(alignment: .leading, spacing: 16) {
HStack {
Image(systemName: "heart.fill")
.font(.system(size: 20, weight: .medium))
.foregroundColor(.red)
.frame(width: 32)
Text("关于")
.font(.system(size: 18, weight: .semibold))
Spacer()
}
Text("QR Scanner 是一款功能强大的二维码和条形码扫描应用,支持多种格式的条码识别和创建。")
.font(.system(size: 14))
.foregroundColor(.secondary)
.lineLimit(nil)
}
.padding(20)
.background(
RoundedRectangle(cornerRadius: 16)
.fill(Color(.systemBackground))
.shadow(color: .black.opacity(0.05), radius: 8, x: 0, y: 2)
)
.padding(.horizontal, 20)
Spacer(minLength: 30)
}
}
}
.navigationTitle("")
.navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(false)
}
}
}
// MARK: -
struct FeatureRow: View {
let icon: String
let iconColor: Color
let title: String
let description: String
var body: some View {
HStack(alignment: .top, spacing: 12) {
Image(systemName: icon)
.font(.system(size: 16, weight: .medium))
.foregroundColor(iconColor)
.frame(width: 20)
VStack(alignment: .leading, spacing: 4) {
Text(title)
.font(.system(size: 16, weight: .medium))
Text(description)
.font(.system(size: 14))
.foregroundColor(.secondary)
.lineLimit(3)
}
Spacer()
}
}
}
#Preview {
SettingsView()
}
Loading…
Cancel
Save