|
|
# 创建二维码界面跳转到自定义样式界面
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
本文档描述了如何从创建二维码界面跳转到自定义样式界面的实现。用户现在可以在创建二维码时选择自定义样式,而不是直接生成标准二维码。
|
|
|
|
|
|
## 功能流程
|
|
|
|
|
|
### 1. 用户操作流程
|
|
|
```
|
|
|
创建二维码界面 → 填写内容 → 点击"创建"按钮 → 跳转到自定义样式界面 → 选择样式 → 保存二维码
|
|
|
```
|
|
|
|
|
|
### 2. 技术实现
|
|
|
|
|
|
#### **CreateQRCodeView.swift 修改**
|
|
|
|
|
|
**添加状态变量**:
|
|
|
```swift
|
|
|
@State private var navigateToStyleView = false
|
|
|
```
|
|
|
|
|
|
**修改创建按钮行为**:
|
|
|
```swift
|
|
|
Button("创建") {
|
|
|
if canCreateQRCode() {
|
|
|
navigateToStyleView = true
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
**添加NavigationLink导航**:
|
|
|
```swift
|
|
|
.background(
|
|
|
NavigationLink(
|
|
|
destination: QRCodeStyleView(qrCodeContent: generateQRCodeContent()),
|
|
|
isActive: $navigateToStyleView
|
|
|
) {
|
|
|
EmptyView()
|
|
|
}
|
|
|
)
|
|
|
```
|
|
|
|
|
|
**新增二维码内容生成方法**:
|
|
|
```swift
|
|
|
private func generateQRCodeContent() -> String {
|
|
|
switch selectedQRCodeType {
|
|
|
case .mail:
|
|
|
// 生成邮件格式内容
|
|
|
case .wifi:
|
|
|
// 生成WiFi格式内容
|
|
|
case .vcard:
|
|
|
// 生成vCard格式内容
|
|
|
case .mecard:
|
|
|
// 生成MeCard格式内容
|
|
|
// ... 其他类型
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### **QRCodeStyleView.swift 修改**
|
|
|
|
|
|
**添加CoreData支持**:
|
|
|
```swift
|
|
|
import CoreData
|
|
|
@StateObject private var coreDataManager = CoreDataManager.shared
|
|
|
```
|
|
|
|
|
|
**移除NavigationView包装**:
|
|
|
```swift
|
|
|
// 移除了NavigationView包装,因为现在通过NavigationLink导航
|
|
|
var body: some View {
|
|
|
VStack(spacing: 0) {
|
|
|
// 内容...
|
|
|
}
|
|
|
.navigationTitle("自定义样式")
|
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
|
// ...
|
|
|
}
|
|
|
```
|
|
|
|
|
|
**修改保存方法**:
|
|
|
```swift
|
|
|
private func saveQRCode() {
|
|
|
guard let qrCodeImage = qrCodeImage else { return }
|
|
|
|
|
|
// 保存到相册
|
|
|
UIImageWriteToSavedPhotosAlbum(qrCodeImage, nil, nil, nil)
|
|
|
|
|
|
// 保存到历史记录
|
|
|
saveToHistory()
|
|
|
|
|
|
dismiss()
|
|
|
}
|
|
|
```
|
|
|
|
|
|
**新增历史记录保存方法**:
|
|
|
```swift
|
|
|
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. 保存到相册和历史记录
|
|
|
|
|
|
这个实现提供了更好的用户体验,让用户能够创建个性化的二维码,同时保持了原有的功能完整性。
|