You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MyQRCode/docs/CREATE_QRCODE_TO_STYLE_VIEW...

5.9 KiB

创建二维码界面跳转到自定义样式界面

概述

本文档描述了如何从创建二维码界面跳转到自定义样式界面的实现。用户现在可以在创建二维码时选择自定义样式,而不是直接生成标准二维码。

功能流程

1. 用户操作流程

创建二维码界面 → 填写内容 → 点击"创建"按钮 → 跳转到自定义样式界面 → 选择样式 → 保存二维码

2. 技术实现

CreateQRCodeView.swift 修改

添加状态变量

@State private var navigateToStyleView = false

修改创建按钮行为

Button("创建") { 
    if canCreateQRCode() {
        navigateToStyleView = true
    }
}

添加NavigationLink导航

.background(
    NavigationLink(
        destination: QRCodeStyleView(qrCodeContent: generateQRCodeContent()),
        isActive: $navigateToStyleView
    ) {
        EmptyView()
    }
)

新增二维码内容生成方法

private func generateQRCodeContent() -> String {
    switch selectedQRCodeType {
    case .mail:
        // 生成邮件格式内容
    case .wifi:
        // 生成WiFi格式内容
    case .vcard:
        // 生成vCard格式内容
    case .mecard:
        // 生成MeCard格式内容
    // ... 其他类型
    }
}

QRCodeStyleView.swift 修改

添加CoreData支持

import CoreData
@StateObject private var coreDataManager = CoreDataManager.shared

移除NavigationView包装

// 移除了NavigationView包装因为现在通过NavigationLink导航
var body: some View {
    VStack(spacing: 0) {
        // 内容...
    }
    .navigationTitle("自定义样式")
    .navigationBarTitleDisplayMode(.inline)
    // ...
}

修改保存方法

private func saveQRCode() {
    guard let qrCodeImage = qrCodeImage else { return }
    
    // 保存到相册
    UIImageWriteToSavedPhotosAlbum(qrCodeImage, nil, nil, nil)
    
    // 保存到历史记录
    saveToHistory()
    
    dismiss()
}

新增历史记录保存方法

private func saveToHistory() {
    let context = coreDataManager.container.viewContext
    let historyItem = HistoryItem(context: context)
    historyItem.id = UUID()
    historyItem.dataType = DataType.qrcode.rawValue
    historyItem.dataSource = DataSource.created.rawValue
    historyItem.createdAt = Date()
    historyItem.isFavorite = false
    historyItem.qrCodeType = "custom"
    historyItem.content = qrCodeContent
    
    do {
        try context.save()
    } catch {
        print("保存到历史记录失败:\(error.localizedDescription)")
    }
}

支持的二维码类型

1. 邮件 (mailto:)

  • 支持收件人、主题、正文、抄送、密送
  • 格式:mailto:email?subject=xxx&body=xxx&cc=xxx&bcc=xxx

2. WiFi

  • 支持SSID、密码、加密类型
  • 格式:WIFI:S:SSID;T:ENCRYPTION;P:PASSWORD;;

3. vCard (3.0版本)

  • 支持姓名、电话、邮箱、公司、职位、地址、网站
  • 格式标准vCard 3.0格式

4. MeCard

  • 支持姓名、昵称、电话、邮箱、公司、职位、地址、网站、备注
  • 格式:MECARD:N:LastName,FirstName;NICKNAME:xxx;TEL:xxx;...;

5. 位置

  • 支持经纬度
  • 格式:geo:latitude,longitude

6. 日历事件

  • 支持事件标题、描述、位置、开始时间、结束时间
  • 格式标准iCalendar格式

7. 社交媒体

  • Instagram: instagram://user?username=xxx
  • Facebook: fb://profile/xxx
  • Spotify: spotify:search:artist;song
  • X (Twitter): twitter://user?screen_name=xxx
  • WhatsApp: whatsapp://send?phone=xxx
  • Viber: viber://add?number=xxx
  • TikTok: https://www.tiktok.com/@xxx
  • Snapchat: https://snapchat.com/add/xxx

8. 电话和短信

  • 电话: tel:xxx
  • 短信: SMSTO:xxx

9. URL

  • 直接使用输入的URL

自定义样式功能

1. 颜色选择

  • 前景色: 20种颜色8种纯色 + 12种渐变色
  • 背景色: 10种浅色系

2. 点类型选择

  • 40多种不同的点类型
  • 包括基础形状、特殊形状、抽象形状、动态形状

3. 眼睛类型选择

  • 40多种不同的眼睛类型
  • 包括基础形状、特殊形状、动态形状

4. Logo选择

  • 15种不同的Logo
  • 包括社交媒体、通讯工具、其他服务

用户体验改进

1. 流程优化

  • 用户填写内容后,点击"创建"按钮
  • 通过NavigationLink导航到自定义样式界面
  • 可以预览和调整二维码样式
  • 最终保存到相册和历史记录

2. 数据持久化

  • 自定义样式生成的二维码会保存到历史记录
  • 类型标记为"custom"
  • 可以在历史记录中查看和管理

3. 错误处理

  • 输入验证确保内容有效
  • 保存失败时的错误提示
  • 网络和权限问题的处理

技术要点

1. 状态管理

  • 使用@State管理界面状态
  • 使用@StateObject管理CoreData
  • 使用@Environment获取dismiss环境

2. 数据传递

  • 通过参数传递二维码内容
  • 使用NavigationLink导航到自定义样式界面
  • 异步处理二维码生成

3. 内存管理

  • 及时释放图片资源
  • 避免内存泄漏
  • 优化大图片的处理

未来扩展

1. 样式模板

  • 预设样式模板
  • 用户自定义模板保存
  • 模板分享功能

2. 批量生成

  • 支持批量生成不同样式的二维码
  • 批量导出功能

3. 高级样式

  • 更多颜色选项
  • 自定义Logo上传
  • 动画效果

总结

通过这次修改,我们实现了从创建二维码界面到自定义样式界面的完整流程。用户现在可以:

  1. 在创建界面填写二维码内容
  2. 点击创建按钮通过NavigationLink导航到样式界面
  3. 选择喜欢的颜色、点类型、眼睛类型和Logo
  4. 预览生成的二维码
  5. 保存到相册和历史记录

这个实现提供了更好的用户体验,让用户能够创建个性化的二维码,同时保持了原有的功能完整性。