如何为Sheet中NavigationLink跳转的第二个视图应用.presentationBackground修饰符?
在iOS 16.4环境下,给Sheet添加.presentationBackground(.ultraThinMaterial)后,Sheet根视图能正常显示半透明材质背景,但通过NavigationLink跳转的二级视图却显示纯白背景。二级视图能继承Sheet的.presentationDetents和.presentationDragIndicator,唯独背景材质不生效。
环境:iPhone 14模拟器、iOS 16.4、Xcode 14.3
解决方案
核心思路是让导航栈的背景透明,让Sheet的材质背景能透到所有导航视图上,具体步骤如下:
- 将
.presentationBackground修饰符应用到Sheet内的整个导航容器(NavigationStack或NavigationView)上,而非单个视图:
// ParentView中弹出Sheet的代码 .sheet(isPresented: $showSheet) { NavigationStack { AddItemView() } .presentationBackground(.ultraThinMaterial) .presentationDetents([.medium]) .presentationDragIndicator(.visible) }
- 给导航栈内的所有视图(包括根视图和二级视图)设置
.background(.clear),移除视图自身的默认不透明背景:
struct AddItemView: View { var body: some View { VStack { NavigationLink("进入详情页", destination: AddItemDetailsView()) } .background(.clear) } } struct AddItemDetailsView: View { var body: some View { Text("详情内容") .padding() .background(.clear) } }
无效尝试的原因说明
- 直接给二级视图加
.presentationBackground没用:该修饰符作用于视图所在的容器(如Sheet),而二级视图属于导航栈内部,并非独立容器; - 单独设置
.background(.ultraThinMaterial)会覆盖Sheet的背景,且导航栈本身的默认不透明背景仍会遮挡材质效果; - 切换到
NavigationStack是正确方向,但未配合透明背景和将presentationBackground应用到导航容器,所以无法生效。
内容的提问来源于stack exchange,提问作者Hana Kim
相关产品推荐
相关产品推荐

