使用UIBezierPath实现月球阴影动画时出现线条异常故障求助
问题原因
该动画 glitch 由 Core Animation 对贝塞尔路径的插值逻辑导致:
- 动画使用的起始、结束两条路径的第二段弧的中心、半径、角度范围均存在差异,Core Animation 执行路径动画时不会对弧的几何参数做插值,而是先将弧转换为贝塞尔曲线控制点,再对控制点做线性插值。
- 当弧的曲率、位置同时变化时,线性插值生成的中间控制点无法拟合出符合预期的过渡弧,就会出现边缘扭曲、尖刺类的显示异常。
另外存在两个可能的诱因放大了故障表现: - 未开启图层边缘抗锯齿,路径边缘容易出现锯齿
- Playground 环境默认视图的 contentScale 未适配屏幕像素密度,导致显示异常更明显
解决方案
- 优先改用 CADisplayLink 实时驱动路径更新:放弃使用 CABasicAnimation 做 path 属性动画,通过 CADisplayLink 按帧计算当前动画进度对应的 angle 值,调用
calculateMoonPath生成对应路径直接赋值给 CAShapeLayer,每一帧的路径都是完全正确的,不会出现插值扭曲。 - 增加图层抗锯齿配置,优化显示效果:
shapeLayer.allowsEdgeAntialiasing = true shapeLayer.contentsScale = UIScreen.main.scale
- 如果需要保留 CABasicAnimation 实现,可以调整路径生成逻辑,改用固定数量控制点的二次/三次贝塞尔曲线拼接路径,保证起始、结束路径的控制点数量、排列顺序完全对应,避免插值异常。
内容的提问来源于stack exchange,提问作者Robot Bender
相关产品推荐
相关产品推荐

