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

12 KiB
Raw Blame History

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 Symbolsbrain.head.profile 替代 🧠magnifyingglass 替代 🔍Emoji 仅保留在知识库卡片封面等表达性内容场景。


1.2 不支持 Dynamic Type动态字体

问题描述: 整个 App 使用 .font(.system(size: N)) 固定字号,未使用 Dynamic Type 语义字体。SwiftUI Skill 指南将此列为 HIGH 严重级别。

涉及范围:全局 — DesignTokens.swift 的 ZXFont 全部为固定字号,所有视图都依赖这些固定值。

// 当前:固定字号,系统缩放无效
.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 级别。

// 当前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 指南明确标注此问题。

// 当前写法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 切换等系统手势产生竞争。

// 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 中的 ZXAIInputBarAIHomeView.swift 底部 inputBarL160-178几乎相同但后者定义了独立的内联视图
  • DailyThinkingPage.swift 内嵌定义了 RecallTestPageWeakPointsPageAIFeedbackPageViewAIChatPage 等多个完整页面,文件达 196 行,违反单一职责
  • SettingsView.swift 定义了大量子页面GoalSetting、MethodPreference、FeedbackForm单个文件达 312 行

修复建议: 将通用组件(输入框、设置行、任务行)收拢到 DesignSystem 目录;将 SettingsView 的子页面提取为独立文件。


四、视觉设计细节问题 (MEDIUM)

4.1 状态指示圆点过小

问题描述: 服务器状态圆点仅 6ptAIHomeView L35学习计时状态圆点 6pt在视网膜屏上几乎无法辨认。

修复建议: 状态指示器至少 8-10pt。


4.2 评分按钮颜色逻辑问题

问题描述: ReviewCardView 中掌握程度评分按钮选中时使用 ZXGradient.brand(紫→橙渐变),而按钮本身各有语义色(红/橙/黄/绿),选中反馈与语义色不匹配。

// 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使用 CanvastimelineView 替代逐帧动画。


5.2 进度条动画时程

问题描述: ZXAIAnalysisProgress 每步 1.2s × 4 步 = 总计 4.8s,超出微交互建议的 150-300ms但作为分析进度展示可接受。然而当前是纯计时动画不反映实际分析进度。

修复建议: 改为连接真实分析状态,或在后期迭代中实现。


5.3 动画 easing 函数使用合理

正面评价: 大部分动画使用了 easeInOuteaseOutspring 等非线性缓动,符合设计规范建议。按钮使用 .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

第二阶段:交互规范修复(下周)

  1. 触控目标放大至 44pt
  2. 异步按钮统一添加 loading 状态
  3. Emoji 替换为 SF Symbols用户可见图标

第三阶段:架构优化(后续迭代)

  1. NavigationStack + navigationDestination 迁移
  2. ZXPressModifier 手势冲突重构
  3. 大型文件拆分DailyThinkingPage / SettingsView
  4. 组件的代码去重

本报告由 ui-ux-pro-max 设计系统 + 代码审查生成,共审查 32 个 Swift 文件、38 个视图组件。