Skip to content

🐛 Bug:iOS 上带渐变填充的图层不遵循父子关系 #2607

@yushuyi

Description

@yushuyi

🐛 Bug:iOS 上带渐变填充的图层不遵循父子关系

环境信息

  • lottie-ios 版本:4.5.2
  • 平台:iOS(iPhone 真机测试)
  • 渲染引擎:默认(Main Thread 和 Core Animation 都测试过)
  • 对比:在 lottie-web 上工作正常

问题描述

带有父子关系(parent)的渐变填充形状图层在 iOS 上无法与其父图层一起移动,但在网页预览(lottie-web)中显示完全正常。

预期行为

紫色渐变扫描线应该与白色背景卡片(父图层)一起垂直移动,在整个动画过程中保持相对位置不变,如网页预览所示。

实际行为

在 iOS 设备上:

  • ✅ 带有 parent 属性的实线描边图层能正确跟随父图层移动
  • ❌ 带有 parent 属性的渐变填充图层独立移动,完全忽略了父子关系

这导致扫描线和背景卡片在不同位置移动,产生明显的视觉分离效果。

截图对比

网页预览(正确):
扫描线在垂直移动过程中始终附着在背景卡片上

(附上网页预览截图)

iOS 设备(错误):
扫描线与背景卡片分离移动

(附上 iOS 截图)

复现步骤

  1. 使用 lottie-ios 4.5.2 加载下方提供的 JSON 文件
  2. 播放动画
  3. 观察到渐变扫描线图层独立于其父图层移动

图层结构分析

动画包含以下关键图层:

{
  "layers": [
    {
      "ind": 1,
      "nm": "形状图层 1",
      "ty": 4,
      "parent": 5,  // ✅ 实线描边 - 工作正常
      "shapes": [{
        "ty": "st",  // 描边
        "c": {"k": [0.513, 0.312, 0.948, 1]},
        "w": {"k": 5}
      }],
      "p": {"a": 1, "k": [...]}  // 有位置动画
    },
    {
      "ind": 2,
      "nm": "形状图层 3",
      "ty": 4,
      "parent": 5,  // ❌ 渐变填充 - 不跟随父图层
      "shapes": [{
        "ty": "gr",
        "it": [{
          "ty": "rc",
          "s": {"k": [417.836, 28.539]}
        }, {
          "ty": "gf",  // 渐变填充
          "o": {"k": 100},
          "g": {
            "p": 2,
            "k": {"k": [0, 0.514, 0.314, 0.949, 1, 0.514, 0.314, 0.949, 0, 0.65, 1, 0]}
          },
          "s": {"k": [-210.315, 0]},
          "e": {"k": [224.937, 0]},
          "t": 1
        }]
      }],
      "p": {"a": 1, "k": [...]}  // 有位置动画
    },
    {
      "ind": 3,
      "nm": "形状图层 2",
      "ty": 4,
      "parent": 5,  // ❌ 渐变填充 - 不跟随父图层
      "shapes": [{
        "ty": "gf"  // 渐变填充,配置同上
      }],
      "p": {"a": 1, "k": [...]}  // 有位置动画
    },
    {
      "ind": 5,
      "nm": "Rectangle 34625127",
      "ty": 4,  // 父背景图层
      "p": {"k": [330, 330, 0]}  // 静态位置,无动画
    }
  ]
}

关键发现

  • 实线描边图层(ind: 1)设置 "parent": 5 → ✅ 正确跟随父图层移动
  • 渐变填充图层(ind: 2, 3)设置 "parent": 5 → ❌ 不跟随父图层,独立移动
  • 这表明问题特定于带有父子关系的渐变填充形状(gradient fill with parent)

尝试的解决方法

  1. 简化了渐变变换矩阵(移除了极端缩放值如 s: [12.106, 1449.551]
  2. 调整了渐变起点/终点坐标
  3. 问题依然存在,父子关系对渐变图层不生效

补充说明

  • 渐变本身的颜色、方向、外观都渲染正确
  • 渐变图层自身的位置动画(p 属性)正常执行
  • 只是父图层的变换(transform)没有被应用到渐变填充的子图层上
  • lottie-web 上所有图层(包括渐变填充)都正确遵循父子关系

附件

完整的 Lottie JSON 文件(附在下方或作为文件上传)


请问这是已知的限制还是 bug?

如果有任何关于如何正确配置带有父子关系的渐变填充图层的建议,将不胜感激!期待修复或获得解决方案指导,谢谢!

扫描_fixed.json
Google Chrome 2025-10-15 11.45.27.tiff
Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions