startup-plan/技术设计/ios-projects/UI-UX审查报告.md
WangDL 6c6c3cf74a feat: 添加 iOS 和 Web 项目 UI/UX 设计审查报告
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 21:03:41 +08:00

295 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AIStudyApp UI/UX 设计审查报告
> 审查日期2026-05-18 | 来源ui-ux-pro-max 设计系统 + 代码审查 | 范围:全部 SwiftUI 视图
---
## 一、严重问题 (CRITICAL)
### 1.1 使用 Emoji 作为图标(严重违反设计规范)
**问题描述:** App 中大量使用 Emoji 代替 SF Symbols 作为 UI 图标。ui-ux-pro-max 设计规范明确禁止此做法("Use SVG icons, not emojis")。
**涉及位置:**
| 文件 | 位置 | Emoji 使用 |
|------|------|-----------|
| ContentView.swift | 快速操作按钮 | 🧠 🔍 🎤 📅 |
| AIHomeView.swift | AI 互动行 | 🎤 ⚠️ 📝 |
| AIHomeView.swift | 建议区域 | 💡 |
| StudyHomeView.swift | 今日任务标记 | (通过 taskType 间接使用) |
| ProfileView.swift | 头像 | 🧑‍🎓 |
| ProfileView.swift | 菜单项 | 🎯 🔔 🧩 💬 |
| ProfileView.swift | 成就徽章 | 🔥 🧠 📚 ⚡ |
| SettingsView.swift | 目标选择 | 🧑‍🎓 💼 📚 🎯 |
| LibraryHomeView.swift | 知识库卡片 | 📚 |
**影响:** Emoji 在不同 iOS 版本/设备上渲染效果不一致,无法精确控制颜色/大小,不符合 iOS 设计规范。应采用 SF Symbols 或自定义图标。
**修复建议:** 将快捷操作按钮改为 SF Symbols`brain.head.profile` 替代 🧠,`magnifyingglass` 替代 🔍Emoji 仅保留在知识库卡片封面等表达性内容场景。
---
### 1.2 不支持 Dynamic Type动态字体
**问题描述:** 整个 App 使用 `.font(.system(size: N))` 固定字号,未使用 Dynamic Type 语义字体。SwiftUI Skill 指南将此列为 HIGH 严重级别。
**涉及范围:全局** — DesignTokens.swift 的 ZXFont 全部为固定字号,所有视图都依赖这些固定值。
```swift
// 当前:固定字号,系统缩放无效
.font(.system(size: 22, weight: .heavy))
// 应使用:语义化 Dynamic Type 字体
.font(.title.weight(.heavy))
```
**影响:** 视障用户无法通过系统设置放大文字,严重降低可访问性。
**修复建议:** 将 DesignTokens 迁移为基于 Dynamic Type 的相对字号体系,或至少使用 `@ScaledMetric` 对关键字号做缩放。
---
### 1.3 未遵循 Reduced Motion 偏好
**问题描述:** 全 App 未检查 `@Environment(\.accessibilityReduceMotion)`所有动画无差别播放。ux-guidelines 将此列为 HIGH 严重级别。
**涉及位置:**
- ZXAnimations.swift — 所有动画(按钮缩放、加载循环、庆祝粒子、进度条)
- ZXLoadingView.swift — 持续旋转动画
- LearningSessionView.swift — 计时器环形进度动画
- ReviewCardView.swift — 卡片翻转动画
- AnalysisHomeView.swift — 图表绘制动画
**修复建议:** 在所有动画处检查 `@Environment(\.accessibilityReduceMotion) var reduceMotion`,当用户开启减弱动态效果时,禁用非功能性动画(如旋转加载改为静态指示,庆祝粒子直接显示结果卡片)。
---
## 二、高优先级问题 (HIGH)
### 2.1 触控目标尺寸不足
**问题描述:** 多个可交互元素小于 Apple HIG 要求的 44×44pt 最小触控目标。
| 元素 | 当前尺寸 | 标准 |
|------|---------|------|
| ZXIconBtn 内部图标 | 36pt边界 OK| 44pt |
| Checkmark circle | 20pt | 44pt |
| 评分按钮标签区 | ~40pt | 44pt |
| TabBar 文字标签 | 10pt 字号 | — |
| ZXAIInteractionRow Checkmark | 20pt | 44pt |
**修复建议:** 对小于 44pt 的触控元素,扩展其 frame、增加 padding或将 onTapGesture 应用到更大的父容器上。
---
### 2.2 Light Mode 对比度不足
**问题描述:** App 在亮色模式下部分文字和边框对比度可能不足。DesignTokens 中亮色模式的文字色为 `#1A1A2E`,但透明度变体(如 0.3/0.35/0.4)在白底上对比度过低。
具体需要检查的色值:
- `zxF03` = `#1A1A2E` opacity 0.3 → 白底对比度约 2.8:1需 ≥4.5:1
- `zxF04` = `#1A1A2E` opacity 0.4 → 白底对比度约 3.7:1
- `zxF035` = `#1A1A2E` opacity 0.35 → 白底对比度约 3.2:1
- `zxBorder008` = `#000000` opacity 0.08 → 白底几乎不可见
**修复建议:** 参照设计规范 ""Glass card light mode: Use bg-white/80 or higher opacity"",将 light 模式下的低透明度文字色替换为更高对比度的实色(如 `#64748B` slate-500 替代 opacity 0.3-0.4)。
---
### 2.3 TextField 仅依赖 Placeholder 作为标签
**问题描述:** 多处 TextField 仅有 placeholder 而无独立 labelux-guidelines 将此列为 HIGH 级别。
```swift
// 当前placeholder 即标签(不符合可访问性)
TextField("问 AI 任何学习问题…", text: $text)
```
**涉及位置:**
- AIHomeView.swift — AI 输入框、搜索建议输入框
- ContentView.swift — ZXAIInputBar
- DailyThinkingPage.swift — 回答输入、RecallTest 输入
- LibraryHomeView.swift — 搜索框
- EditProfilePage.swift — 各项编辑字段(有 title 文字但非语义 label
**修复建议:** 为输入框添加 `.accessibilityLabel()` 或在前面放置独立 Text 标签EditProfilePage 的 ZXEditField 应将 title 链接为 label。
---
## 三、中优先级问题 (MEDIUM)
### 3.1 导航已使用 Deprecated API
**问题描述:** 大量使用 `NavigationLink(destination:)` 而非 iOS 16+ 推荐的 `navigationDestination(for:)`。SwiftUI Stack 指南明确标注此问题。
```swift
// 当前写法deprecated
NavigationLink(destination: AIChatPage()) { ... }
// 推荐写法
NavigationLink(value: Route.aiChat) { ... }
// + .navigationDestination(for: Route.self) { route in ... }
```
**修复建议:** 建立路由枚举,统一使用 NavigationStack + navigationDestination 模式。
---
### 3.2 ZXPressModifier 手势冲突
**问题描述:** `ZXPressModifier` 使用 `DragGesture(minimumDistance: 0)` 实现按压态,这会与 ScrollView 滚动、TabView 切换等系统手势产生竞争。
```swift
// ZXAnimations.swift L32-33
.simultaneousGesture(
DragGesture(minimumDistance: 0)
```
**影响:** 在 ScrollView 中的按压元素可能导致滚动不流畅,或按压态意外触发。
**修复建议:** 改用 ButtonStyle 封装按压效果(已有 ZXButtonStyle但 ZXPressModifier 存在重复),或使用 `LongPressGesture` + `TapGesture` 组合替代 DragGesture。
---
### 3.3 按钮/交互元素缺少 loading 状态
**问题描述:** 多处异步操作的按钮未显示 loading 状态。ux-guidelines 将此列为 HIGH。
**涉及位置:**
- AIHomeView — 发送按钮无 loading 态
- SettingsView — 保存按钮无 loading 反馈
- GoalSettingDetailView / MethodPreferenceView — 保存中无 loading 指示
- FeedbackFormView — 提交中无 loading 指示
- DailyThinkingPage — 提交按钮无 loading 态
**对比:** EditProfilePage.swift 已有 `isSaving` + `ProgressView` 的完善实现,可作为模板。
**修复建议:** 为所有异步提交按钮添加 `ProgressView` + 禁用状态(参考 EditProfilePage 的实现)。
---
### 3.4 代码复用与组件膨大
**问题描述:** 存在重复实现和组件定义分散的问题:
- `ContentView.swift` 中的 `ZXAIInputBar``AIHomeView.swift` 底部 inputBarL160-178几乎相同但后者定义了独立的内联视图
- `DailyThinkingPage.swift` 内嵌定义了 `RecallTestPage``WeakPointsPage``AIFeedbackPageView``AIChatPage` 等多个完整页面,文件达 196 行,违反单一职责
- `SettingsView.swift` 定义了大量子页面GoalSetting、MethodPreference、FeedbackForm单个文件达 312 行
**修复建议:** 将通用组件(输入框、设置行、任务行)收拢到 DesignSystem 目录;将 SettingsView 的子页面提取为独立文件。
---
## 四、视觉设计细节问题 (MEDIUM)
### 4.1 状态指示圆点过小
**问题描述:** 服务器状态圆点仅 6ptAIHomeView L35学习计时状态圆点 6pt在视网膜屏上几乎无法辨认。
**修复建议:** 状态指示器至少 8-10pt。
---
### 4.2 评分按钮颜色逻辑问题
**问题描述:** `ReviewCardView` 中掌握程度评分按钮选中时使用 `ZXGradient.brand`(紫→橙渐变),而按钮本身各有语义色(红/橙/黄/绿),选中反馈与语义色不匹配。
```swift
// ZXRatingBtn: 选中时统一使用 ZXGradient.brand 而非各自语义色
.background(selected ? AnyView(ZXGradient.brand) : AnyView(Color.zxFill005))
```
**修复建议:** 选中时使用各按钮对应颜色(红=`.red`,橙=`.orange`,黄=`.yellow`,绿=`.green`),增强语义关联。
---
### 4.3 骨架屏实现问题
**问题描述:** `ZXShimmer` 使用白色半透亮光,在 light mode 下几乎不可见(白色叠加在浅色背景上)。
**修复建议:** 根据 colorScheme 使用不同叠加色light mode 用 `Color.black.opacity(0.06)`dark mode 用 `Color.white.opacity(0.06)`
---
### 4.4 TabBar 定位指示器可优化
**问题描述:** 当前 TabBar 选中指示为紫色半透明圆28pt, scale 1.4),视觉冲击力弱,与 Figma/Apple 标准胶囊状指示器差距明显。
**修复建议:** 改为横向胶囊形状 + SF Symbol 的 `.fill` 变体(如 `brain.head.profile.fill`),增强选中/非选中区分度。
---
### 4.5 Emoji 头像与系统设计不协调
**问题描述:** `ProfileView` 使用 🧑‍🎓 作为头像占位80pt 圆内 36pt emoji与系统联系人头像风格不统一。
**修复建议:** 使用 SF Symbol `person.crop.circle.fill` + 渐变背景,或集成系统联系人头像组件。
---
## 五、动效建议 (LOW-MEDIUM)
### 5.1 庆祝动画粒子性能
**问题描述:** `ZXCelebrationView` 使用 60 个 `Circle()` 粒子同时动画,使用 `UIScreen.main.bounds` 计算位置。每帧重绘 60 个粒子在低端设备上可能掉帧。
**修复建议:** 减少粒子数量至 30-40使用 `Canvas``timelineView` 替代逐帧动画。
---
### 5.2 进度条动画时程
**问题描述:** `ZXAIAnalysisProgress` 每步 1.2s × 4 步 = 总计 4.8s,超出微交互建议的 150-300ms但作为分析进度展示可接受。然而当前是纯计时动画不反映实际分析进度。
**修复建议:** 改为连接真实分析状态,或在后期迭代中实现。
---
### 5.3 动画 easing 函数使用合理
**正面评价:** 大部分动画使用了 `easeInOut``easeOut``spring` 等非线性缓动,符合设计规范建议。按钮使用 `.easeOut(duration: 0.15)` 的快响应按压反馈,设计合理。
---
## 六、正面设计亮点
以下为值得保留和发扬的设计决策:
| 方面 | 实现 | 评价 |
|------|------|------|
| **设计令牌体系** | ZXColors / ZXGradient / ZXRadius / ZXSpacing / ZXSize / ZXFont | 完整统一,像素级还原度高 |
| **暗色模式** | 全量 `Color(light:dark:)` 自适应 | 双模式覆盖完整 |
| **品牌渐变** | 紫→橙 135° 渐变贯穿全应用 | 品牌一致性强 |
| **Toast 系统** | 全局单例 + 队列管理 + 类型系统 | 架构设计优秀 |
| **触觉反馈** | `.sensoryFeedback(.impact(weight: .light))` | 增强操作感知 |
| **无障碍标签** | 大部分按钮有 `.accessibilityLabel` / `.accessibilityHint` | 覆盖度较高 |
| **撤消操作** | `confirmationDialog` 二次确认 | 防止误操作 |
| **错误处理 UI** | EditProfilePage 的 saveError 状态 | 良好的错误反馈 |
| **加载骨架** | ZXShimmer + ZXDotLoader + ZXLoadingView | 多层次的 loading 方案 |
| **完成庆祝** | ZXCelebrationView 粒子+卡片组合 | 情感化设计到位 |
---
## 七、优先级整改路线
### 第一阶段:可访问性修复(本周)
1. [ ] 全 App 添加 `@Environment(\.accessibilityReduceMotion)` 检查
2. [ ] 关键字号迁移至 Dynamic Type至少 title/body/caption
3. [ ] Light mode 文字对比度修复zxF03/zxF04/zxF035
4. [ ] TextField 添加 accessibilityLabel
### 第二阶段:交互规范修复(下周)
5. [ ] 触控目标放大至 44pt
6. [ ] 异步按钮统一添加 loading 状态
7. [ ] Emoji 替换为 SF Symbols用户可见图标
### 第三阶段:架构优化(后续迭代)
8. [ ] NavigationStack + navigationDestination 迁移
9. [ ] ZXPressModifier 手势冲突重构
10. [ ] 大型文件拆分DailyThinkingPage / SettingsView
11. [ ] 组件的代码去重
---
*本报告由 ui-ux-pro-max 设计系统 + 代码审查生成,共审查 32 个 Swift 文件、38 个视图组件。*