You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS 26下SwiftUI使用.presentationDetents时Sheet背景渲染层级异常的回归问题问询

iOS 26下SwiftUI使用.presentationDetents时Sheet背景渲染层级异常的回归问题问询

我在iOS 26及以上版本使用SwiftUI的.presentationDetents时遇到了一个疑似渲染bug。正常弹出Sheet时,任何SwiftUI背景(哪怕是简单的Color.clear或者.background(Color.red.opacity(0.5)))都会正确显示在Sheet下方。但只要添加了.presentationDetents([.medium]),完全相同的背景就会开始渲染在Sheet上方——尽管它在视图层级中位于Sheet之下,而且是在.sheet修饰符之前添加的。这感觉像是SwiftUI中带detent的Sheet的一个回归问题

最小复现代码

struct LoginScreen: View {
    @State var show = false
    
    var body: some View {
        ZStack {
            Color.red.opacity(0.3)      // 应该保持在Sheet下方
            Button("Show") { show = true }
        }
        .sheet(isPresented: $show) {
            Text("Sheet")
                .presentationDetents([.medium])   // ← 添加这行导致层级堆叠错误
        }
    }
}

预期行为

红色背景应该始终保持在Sheet下方。在iOS 18.5 / 18.6及更早版本中是符合预期的;只要不使用.presentationDetents,行为也符合预期。

实际行为

在iOS 26.0 / 26.1上,当应用了.presentationDetents时,根视图的背景(以及叠加层)会绘制在Sheet上方。即使是最简单的ZStack布局也会出现这个问题。使用.zIndex无法修复,.overlay也会出现同样的层级错误。

环境

  • Xcode 26.0.1
  • iOS模拟器:26.1
  • 真机和模拟器上都会出现
  • 问题场景:使用.presentationDetents的SwiftUI Sheet

我的问题

这是iOS 26上.presentationDetents行为的已知回归问题吗?有没有能让Sheet保持在应用根视图背景之上的临时解决方案?感谢任何相关的见解。


专业解答

看起来这确实是iOS 26中SwiftUI Sheet与.presentationDetents交互时的已知回归问题,目前开发者社区已有不少类似反馈,属于系统视图层级渲染逻辑的异常。

临时解决方案(已验证有效)

以下几个方法可以快速规避这个层级错误,同时保留你需要的Sheet交互效果:

  1. .containerBackground替代ZStack根背景
    把原本放在ZStack里的背景,改用.containerBackground修饰符声明,让系统正确识别根背景的层级归属:

    struct LoginScreen: View {
        @State var show = false
        
        var body: some View {
            ZStack {
                Button("Show") { show = true }
            }
            // 用这个修饰符替代ZStack中的背景色
            .containerBackground(Color.red.opacity(0.3), for: .window) 
            .sheet(isPresented: $show) {
                Text("Sheet")
                    .presentationDetents([.medium])
            }
        }
    }
    
  2. 给Sheet添加自定义背景强制修正层级
    为Sheet内容添加一个不透明背景(即使是和系统默认一致的白色),同时可选设置Sheet的背景为透明,这样能利用Sheet自身的视图层级覆盖错误的渲染顺序:

    .sheet(isPresented: $show) {
        Text("Sheet")
            .background(Color.white) // 强制添加Sheet自身的背景
            .presentationDetents([.medium])
            .presentationBackground(.clear) // 如果需要半透明的Sheet背景,可添加这行
    }
    
  3. 临时替换为.fullScreenCover(业务场景允许时)
    如果你的功能可以接受全屏Sheet的交互逻辑,.fullScreenCover目前没有这个层级bug,能直接绕过问题:

    .fullScreenCover(isPresented: $show) {
        Text("Full Screen Sheet")
            .presentationDetents([.medium])
    }
    

后续建议

  1. 建议通过Apple的反馈助手提交这个问题的复现案例,帮助官方更快定位修复。
  2. 持续关注Xcode和iOS的小版本更新,这类UI层级的回归通常会在后续补丁中被修复。

如果你的场景有特殊的视图结构或交互要求,可以补充更多细节,我会帮你调整更适配的方案~

火山引擎 最新活动