我正在使用SwiftUI开发一个应用程序。
我正在寻找一些方法,使一个不透明的工作表视图的背景颜色。
有什么办法吗?
我试着用下面的代码做到这一点,我可以用不透明度属性更改颜色,但我看不到工作表视图下的文本(工作表)。
import SwiftUI
struct ContentView: View {
@State var isSheet = false
var body: some View {
Button(action: {self.isSheet.toggle()}) {
Text("Sheet")
}.sheet(isPresented: $isSheet){
Color.yellow.opacity(0.5)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
字符串
Xcode:Version 11.7
Swift:Swift 5
8条答案
按热度按时间vvppvyoh1#
你不能使用标准的工作表官方API(因为默认情况下每个主机控制器视图都是不透明的),所以你可以创建自定义工作表视图(带有你需要的任何功能),或者使用运行时解决方法来找到该视图并将其背景设置为清除。
的数据
字符串
backup
7y4bm7vi2#
使用我一整天都在努力寻找的来自@ marti的令人敬畏的答案,我已经构建了一个简单的视图修改器,现在可以在.sheet或.fullScreenCover模态视图中应用,并提供透明的背景。然后您可以根据需要为内容设置框架修改器,以适应屏幕,而无需用户知道模态不是自定义大小。
字符串
使用方法:
型
pkbketx93#
从iOS 16.4开始,应该可以使用带有颜色和模糊的.presentationBackground(_ style: S)(material types)。如果你想为一张纸制作透明背景:
字符串
或者你可以使用.presentationBackground()来继承presenter的背景样式。
型
b09cbbtk4#
虽然提供的解决方案确实有效,但当它们被交换时,它们也会保持背景对 * 其他 * 工作表透明。
所以需要在
dismantleUIView
中恢复背景颜色,如下所示:字符串
请注意,我使用了Swift中新的并发特性。
mrzz3bfm5#
对于那些认为依赖于DispatchQueue中的消息顺序不是一个好主意的人(实际上不是),这里有一个依赖于重写
didMoveToSuperview()
的解决方案。这仍然不是100%的未来证明,因为我们正在修改superview的superview,并且不能保证它在我们自己的视图添加到层次结构时可用,但我认为这仍然比DispatchQueue解决方案更好,因为视图通常是从上到下添加的,即当调用
didMoveToSuperview()
时,superview的superview可能可用。字符串
scyqe7ek6#
把它放在
Modal.swift
中:字符串
像这样使用:
型
kkih6yb87#
阿森伯格不希望他的答案被编辑,所以单独发布:
字符串
amrnrhlw8#
在SwiftUI中,sheet修饰符通常用于呈现新视图,而不是样式化背景。要实现所需的不透明度背景颜色,您可以使用ZStack和Color视图的组合。下面是一个示例:
字符串
在这个例子中,使用ZStack来覆盖按钮和背景颜色。当点击按钮时,会显示具有所需背景颜色和不透明度的Color视图,覆盖整个屏幕。您可以自定义VStack内部的内容,以显示所需的工作表内容。
另外,请注意在背景颜色上使用onTapGesture来在点击时关闭工作表。根据应用程序的设计调整颜色,不透明度和内容。