NamespaceReader 用于 创建并管理一个几何动画命名空间(Namespace)。
该命名空间是实现以下能力的前提条件:
matchedGeometryEffect(组件级几何联动动画)matchedTransitionSource(页面级导航转场动画)navigationTransition(如 zoom 转场)可以将 NamespaceReader 理解为:
一个“动画坐标系提供者”,用于告诉系统:哪些视图属于同一组几何动画作用域。
NamespaceReader 并不是一个普通的 UI 组件,而是一个 命名空间生成器,用于:
NamespaceID它在 Scripting 中对应 SwiftUI 的:
@NamespaceNamespace.ID说明:
NamespaceReader 是一个 函数式子节点组件namespace 即为当前创建的命名空间实例namespace 的本质作用是:
把一组“逻辑上可能互相关联的视图”
显式地声明为:
“它们允许进行几何匹配动画”
如果没有相同的 namespace:
id 完全一致| 情况 | 是否发生几何匹配 |
|---|---|
相同 id + 相同 namespace |
会 |
相同 id + 不同 namespace |
不会 |
不同 id + 相同 namespace |
不会 |
不同 id + 不同 namespace |
不会 |
结论:
必须同时满足
id与namespace完全一致,系统才会建立几何匹配关系。
matchedGeometryEffect 依赖 namespace 建立“跨视图几何映射”
NamespaceReader 是 matchedGeometryEffect 的 前置条件
没有 NamespaceReader:
matchedGeometryEffect 无法工作页面级转场动画依赖 namespace 来配对:
NamespaceReader 用于:
该示例中:
NamespaceReader 负责创建动画坐标系
两个 Circle 因为:
id 相同namespace 相同
从而建立起几何联动关系该结构说明:
namespace 由 NamespaceReader 生成
同时被:
从而建立完整的页面级共享几何动画
NamespaceReader 每次创建:
该 namespace 的生命周期:
namespace 只对其 render function 内部的视图生效
不可跨越组件树自动共享
如果需要跨组件共享:
namespace请检查:
NamespaceReadernamespace常见原因:
NamespaceReader 被条件渲染反复销毁与重建
每次重建都会生成新的 namespace
导致旧视图与新视图:
建议:
NamespaceReader 放在 稳定的父级节点if / ternary 结构中频繁切换问题表现:
排查思路:
确认 source 与 target 是否真的来自:
NamespaceReader 实例一个独立动画区域使用一个 NamespaceReader
不要为每一个视图都单独创建 NamespaceReader
页面级动画:
组件级动画:
同一个 namespace 内:
id 给不相关的视图适合使用 NamespaceReader 的场景:
不需要使用 NamespaceReader 的场景: