SwiftUI中Sheet内通过NavigationLink跳转后背景变白的问题求助
嘿,我刚碰到和你完全一样的坑!在Sheet里用NavigationLink跳转到新视图后,原本好好的半透明背景直接变成纯白,试了各种background和presentationBackground都没用,折腾了好一会儿才搞明白问题所在。
问题根源
其实原因很简单:你在Sheet里嵌套的NavigationView本身默认带有白色背景,当你通过NavigationLink跳转到新视图时,这个新视图是在NavigationView的导航栈里,它会完全覆盖掉Sheet的presentationBackground,所以你看到的白色其实是NavigationView的默认背景,不是Sheet的背景消失了。
解决办法
我们只需要让NavigationView的背景和Sheet的半透明材质保持一致,或者直接把它设为透明,让Sheet的背景透出来就行。下面给你两种可行的修改方案:
方案一:给NavigationView设置相同的半透明背景材质
直接在Sheet里的NavigationView上添加和presentationBackground一样的材质背景,这样整个导航栈里的视图都会继承这个背景,跳转后就不会变白了:
// 修改ContentView中的Sheet部分 .sheet(isPresented: .constant(true)) { NavigationView { InfoSheetView_Demo(currentSheetOpeningLevel: $currentSheetOpeningLevel) } .background(.ultraThinMaterial) // 关键:和Sheet的presentationBackground保持一致 .navigationViewStyle(.stack) .presentationDetents([.medium, .large], selection: $currentSheetOpeningLevel) .interactiveDismissDisabled(true) .presentationBackgroundInteraction(.enabled) .presentationBackground(.ultraThinMaterial) }
方案二:让NavigationView背景透明
如果想保留Sheet的presentationBackground效果,也可以把NavigationView及其内部视图的背景设为透明,这样Sheet的半透明背景就能透过来:
// 修改ContentView中的Sheet部分 .sheet(isPresented: .constant(true)) { NavigationView { InfoSheetView_Demo(currentSheetOpeningLevel: $currentSheetOpeningLevel) .background(Color.clear) // 内部视图背景透明 } .background(Color.clear) // NavigationView本身背景透明 .navigationViewStyle(.stack) .presentationDetents([.medium, .large], selection: $currentSheetOpeningLevel) .interactiveDismissDisabled(true) .presentationBackgroundInteraction(.enabled) .presentationBackground(.ultraThinMaterial) }
额外提醒
你之前在目标视图PlaceHolderView_Demo里设置的.background(Color.clear, ignoresSafeAreaEdges: .all)是对的,保持这个设置就行,这样新视图不会额外添加背景覆盖。
试一下这两种方案,应该就能解决背景变白的问题啦!
备注:内容来源于stack exchange,提问作者MTRNord

