一、drawRect 半圆仪表盘角度算偏,问题到底出在哪
在 iOS 里用drawRect手写半圆形仪表盘,是很多同学做信用分、评分、进度展示时的常规操作。但真正动手写的时候,最容易翻车的不是 UIBezierPath 的 API,而是角度换算。
典型现象是这样的:背景弧线用DEGREES_TO_RADIANS(165)作为起点,再叠加DEGREES_TO_RADIANS(210)作为总弧长,看起来是 165° 到 375°,也就是一个开口朝下的半圆。可一旦进度值_starScore超过 0.6,红色进度条就突然多转 20°,或者干脆少画半段,和背景弧线对不上。
问题就出在endAngle的分支逻辑上。原文里写了:
if (_starScore >= 0.6) { endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*(_starScore-0.5)*2; } else { endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*(_starScore/0.6)*0.2; }这两段公式的缩放系数完全不一致:一个乘(_starScore-0.5)*2,一个乘(_starScore/0.6)*0.2。当_starScore = 0.6时,第一段算出的是210 * 0.2 = 42°,第二段算出的是210 * 0.2 = 42°,勉强接上;但_starScore = 0.7时,第一段变成210 * 0.4 = 84°,而如果按线性应该是210 * 0.7 = 147°。角度直接跳变,视觉上就是“多转了 20°”或者“少了一段”。
这类问题靠肉眼盯代码很难一次改对,因为DEGREES_TO_RADIANS宏把角度和弧度混在一起,分支里又叠了多层系数。更高效的做法是:把 drawRect 里的角度分支、报错现象、期望效果一起丢给 Codex,让它帮你逐行核对 startAngle / endAngle 的换算链路。而 Codex 要稳定跑起来,需要一个可用的 API Key 和 Base URL——这正是 TaoToken 能帮上忙的地方。
TaoToken 官网:https://taotoken.net/?utm_source=taotoken_aicg_blog_end
二、TaoToken 前置:给 Codex 配一个可用的 Key 和 Base URL
Codex 本身是命令行/编辑器里的编码助手,它要调用模型能力,就必须配置 API Key 和 Base URL。很多同学卡在“Key 从哪来、Base URL 填什么”这一步,导致 Codex 根本发不出请求,更别说帮你查弧度换算了。
TaoToken 的作用就是提供这个接入层:你先在官网创建一个 Key,然后把 Codex 的 Base URL 指向 TaoToken 的 API 地址,Codex 就能正常发起模型请求。整个过程不需要你改 drawRect 里的任何业务代码,只是把“模型调用通道”打通。
具体来说,你需要做三件事:
- 打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建一个 API Key。
- 记住 API 地址:https://taotoken.net/api (注意这个地址不加 UTM 参数)。
- 把 Key 填到 Codex 的配置里,Base URL 填上面的 API 地址。
拿到 Key 之后,你就可以把drawRect里那段startAngle/endAngle分支贴给 Codex,让它帮你算清楚:165° 起点、210° 总弧长、_starScore从 0 到 1 时,endAngle到底应该等于多少弧度。
如果你用的是 Claude Code 这类工具,配置方式是在settings.json里写ANTHROPIC_*相关字段;如果用的是 Codex,则是在config.toml里配置。下面给出可复制的配置片段。
三、可复制配置:Codex 的 config.toml 与 Claude Code 的 settings.json
3.1 Codex 的 config.toml 配置
Codex 读取的是config.toml,核心是base_url和api_key两项。把下面内容按你的实际路径填好:
# ~/.codex/config.toml model = "gpt-4o" base_url = "https://taotoken.net/api" api_key = "YOUR_API_KEY"注意两点:
base_url用https://taotoken.net/api,不要带 UTM 后缀。api_key换成你在 TaoToken 官网创建的那串 Key。
3.2 Claude Code 的 settings.json 配置
如果你用的是 Claude Code,配置写在settings.json里,字段是ANTHROPIC_*系列:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022" } }同样,ANTHROPIC_BASE_URL填https://taotoken.net/api,ANTHROPIC_API_KEY填你的 Key。
3.3 如果你用 CLI 方式
TaoToken 也提供了 CLI 工具,适合在终端里直接跑:
npm i -g @taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m gpt-4o这里的-u就是 API 地址,-m是模型 ID,-k是你的 Key。跑起来之后,就可以在终端里把 drawRect 的角度问题贴进去问。
配置完成后,建议先做一次最小验证,确认 Codex 真的能连上模型,再让它去查弧度换算。
四、验证请求:让 Codex 核对 startAngle / endAngle
配置好之后,不要一上来就贴整个ArcLineView.m。更高效的做法是先验证通道,再定位角度。
4.1 最小验证请求
在 Codex 里发一句最简单的:
请用一句话确认你能收到这条消息。如果 Codex 正常返回,说明 Base URL 和 Key 都通了。如果报 401 或连接超时,先回到第三节检查config.toml/settings.json里的字段名和地址。
4.2 把角度分支贴给 Codex
通道验证通过后,把原文里这段核心逻辑贴进去:
CGFloat startAngle = DEGREES_TO_RADIANS(165); CGFloat endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*_starScore; if (_starScore >= 0.6) { endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*(_starScore-0.5)*2; } else { endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*(_starScore/0.6)*0.2; }然后问它:
背景弧线是 165° 起点、210° 总弧长。进度值 _starScore 从 0 到 1 时, endAngle 应该等于 165° + 210° * _starScore。请指出上面 if/else 分支里 哪些系数会导致角度跳变,并给出修正后的 endAngle 表达式。Codex 通常会指出:(_starScore-0.5)*2和(_starScore/0.6)*0.2这两个系数都不是线性的,正确做法是直接DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210) * _starScore,不需要分支。
4.3 成功结果长什么样
修正后,_starScore = 0.6时endAngle = 165° + 126° = 291°;_starScore = 1.0时endAngle = 165° + 210° = 375°。红色进度条会严格沿着背景弧线从 165° 走到 375°,不会在 0.6 处突然跳 20°。
如果你还想让 Codex 顺便检查creatLabel里的index*ANGLE-200+10和sin/cos换算,也可以一起贴进去,让它核对 label 旋转角度和圆心坐标是否一致。
五、本篇常见错排查
5.1 角度跳变:分支系数不一致
最常见的错就是if (_starScore >= 0.6)分支里用了(_starScore-0.5)*2,而else里用了(_starScore/0.6)*0.2。这两个系数在 0.6 处虽然勉强相等,但斜率不同,导致进度条在 0.6 前后速度不一致。修正方式是去掉分支,直接用210 * _starScore。
5.2 起点偏移:165° 和 210° 混用
背景弧线用165°起点、210°总弧长,进度条也必须用同一组基准。如果进度条误用了180°起点或180°总弧长,就会整体偏移。检查startAngleBag和startAngle是否都是DEGREES_TO_RADIANS(165)。
5.3 弧度/角度混算
DEGREES_TO_RADIANS宏只应该包住角度值,不应该把已经转好的弧度再包一层。比如DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*_starScore是对的,但如果你写成DEGREES_TO_RADIANS(165 + 210*_starScore),虽然数学上等价,可读性差,容易在分支里改错。
5.4 Codex 连不上:Base URL 或 Key 错
如果 Codex 报 401,先检查config.toml里的api_key是否填了YOUR_API_KEY占位符;如果报连接超时,检查base_url是否写成了https://taotoken.net/api,而不是带 UTM 的官网地址。Claude Code 用户检查ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY字段名是否拼对。
5.5 label 旋转和圆心坐标对不上
creatLabel里index*ANGLE-200+10和sin/cos里的index*ANGLE-10是两套偏移量,如果 label 位置和弧线刻度对不上,可以把这两个表达式一起贴给 Codex,让它核对角度基准是否和165°起点一致。
六、语义一致 CTA
排障和接入过程中,最常需要的两个入口是 API Key 管理和接入文档。如果你在配置 Codex 的config.toml或 Claude Code 的settings.json时卡住,可以直接去:
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
如果你只是想先验证模型能不能正常返回,可以打开模型对话页面试一句:
- 模型对话:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite
如果你打算长期用 Codex 做 iOS 编码和 Agent 任务,比如反复核对 drawRect 角度、批量检查 UIBezierPath 分支,可以了解 Coding Plan:
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
回到本篇的核心:drawRect里半圆仪表盘角度不对,根源在endAngle分支的系数不一致。先把 TaoToken 的 Key 和 Base URL 配好,让 Codex 对着startAngle/endAngle逐行核对,比你自己盯着DEGREES_TO_RADIANS宏反复试要快得多。