You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MatchGeometryEffect返回原位置时显示异常问题求助

解决MatchGeometryEffect返回时元素消失的问题

问题核心是动画过程中原位置视图与顶部视图的层级冲突,加上ScrollView的布局特性导致元素被遮挡。以下是具体修复方案:

修改HorizontalScrollView

对选中元素进行隐藏,并通过isSource和zIndex控制动画层级:

struct HorizontalScrollView: View {
    @Binding var currentColor: ColorModel?
    var colors: [ColorModel]
    var namespace: Namespace.ID
    
    var body: some View {
        ScrollView(.horizontal, showsIndicators: false) {
            HStack(spacing: 8) {
                ForEach(colors, id: \.self) { color in
                    RoundedRectangle(cornerRadius: 8)
                        .foregroundStyle(color.color)
                        .matchedGeometryEffect(id: color.id, in: namespace, isSource: currentColor != color)
                        .frame(width: 300, height: 200)
                        .opacity(currentColor == color ? 0 : 1)
                        .zIndex(currentColor == color ? -1 : 0)
                        .onTapGesture {
                            withAnimation(.easeInOut) {
                                currentColor = color
                            }
                        }
                }
            }
            .padding(.horizontal, 8)
        }
    }
}

关键修改点:

  • isSource: currentColor != color:未选中元素作为动画源,选中时禁用源属性避免冲突
  • opacity(currentColor == color ? 0 : 1):选中后隐藏原位置元素,防止重复显示
  • zIndex(currentColor == color ? -1 : 0):降低选中元素的层级,避免遮挡动画中的顶部视图

修改ContentView的overlayView

给顶部视图设置更高层级,确保动画全程可见:

private func overlayView(color: ColorModel) -> some View {
    RoundedRectangle(cornerRadius: 8)
        .foregroundStyle(color.color)
        .matchedGeometryEffect(id: color.id, in: namespace)
        .frame(width: UIScreen.main.bounds.width - 32, height: 200)
        .zIndex(1)
        .onTapGesture {
            withAnimation(.easeInOut) {
                currentColor = nil
            }
        }
}

关键修改点:

  • 添加.zIndex(1):确保顶部视图始终处于所有元素之上,不会被ScrollView内容遮挡
  • 移除.transition(.identity):MatchGeometryEffect会自动处理过渡动画,无需额外自定义

额外优化

使用.easeInOut动画曲线,让飞行动画更自然流畅,代码中已统一应用该动画配置。

修改后,元素会平滑完成"飞到顶部-返回原位置"的完整动画,不会出现中途消失的问题。

内容的提问来源于stack exchange,提问作者Okan T.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:04:56