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

如何让SwiftUI BottomSheet显示在TabBar后方?

实现iOS 16 BottomSheet不遮挡TabView的解决方案

问题场景

想借助iOS 16的BottomSheet特性做「查找我的」那样的视图效果,但当前代码里TabView会被BottomSheet挡住,现有代码如下:

TabView {
    Text("View 1")
        .sheet(isPresented: .constant(true)) {
            Text("Sheet View Content")
                .presentationDetents([.medium, .large])
        }
        .tabItem {
            Label("Menu", systemImage: "list.dash")
        }

    Text("View 2")
        .tabItem {
            Label("Order", systemImage: "square.and.pencil")
        }
}

问题原因

你把.sheet修饰符加在了TabView的子页面(View 1)上,这会让Sheet嵌套在单个页面的层级里,自然会把底部的TabBar给挡住。

解决方法

把.sheet移到TabView的外层,让Sheet属于整个TabView的父视图层级,这样Sheet就会悬浮在TabView上方,TabBar不会被遮挡。同时用@State变量来控制Sheet的显示状态,比硬写.constant(true)更灵活。

修改后的代码:

struct ContentView: View {
    @State private var showSheet = true

    var body: some View {
        TabView {
            Text("View 1")
                .tabItem {
                    Label("Menu", systemImage: "list.dash")
                }

            Text("View 2")
                .tabItem {
                    Label("Order", systemImage: "square.and.pencil")
                }
        }
        .sheet(isPresented: $showSheet) {
            Text("Sheet View Content")
                .presentationDetents([.medium, .large])
            // 可选:让Sheet在中等高度时,底部TabBar仍可交互,更贴近「查找我的」体验
                .presentationBackgroundInteraction(.enabled(upThrough: .medium))
        }
    }
}

额外说明

  • 移到TabView外层后,Sheet会在所有Tab页面上方显示,切换Tab时Sheet不会消失,这和「查找我的」的逻辑一致。
  • presentationBackgroundInteraction修饰符可以让Sheet在中等高度时,背景区域(包括TabBar)保持可交互状态,进一步还原目标效果。

内容的提问来源于stack exchange,提问作者Tbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:35:21