【发布时间】:2020-10-27 02:20:50
【问题描述】:
我遇到了 SwiftUI 和 ScrollView 的问题。当我在滚动视图中有一个具有混合模式属性的子视图时,混合不会影响滚动视图后面的内容。但是如果我把同一个项目放在一个堆栈中,它确实会影响背景。
我尝试将混合模式直接应用到滚动视图,但由于子视图中还有其他项目没有混合,所以它搞砸了。 这是一个示例来说明这个问题。这样,您可以在 Stack 中看到渐变混合效果,但在滚动视图中却看不到。
let mode: BlendMode = .overlay
func item(_ num: Int) -> some View {
return AnyView(
ZStack {
Rectangle()
.fill( LinearGradient(gradient: Gradient(colors: [Color.blue, Color.black]), startPoint: .top, endPoint: .bottom))
.frame(width: 100, height: 100)
.blendMode(mode)
Text("Number = \(num)")
.font(.headline)
.foregroundColor(Color.white)
}
)
}
struct ContentView: View {
var body: some View {
ZStack {
Rectangle()
.fill(RadialGradient(gradient: Gradient(colors: [Color.black, Color.red]), center: .topLeading, startRadius: 200, endRadius: 800))
HStack (spacing: 50) {
VStack (spacing: 50) {
ForEach((1...5).reversed(), id: \.self) {
item($0)
}
}
ScrollView {
VStack (spacing: 50) {
ForEach((1...5).reversed(), id: \.self) {
item($0)
}
}
}
//.blendMode(mode)
/*
blendMode for item() in ScrollView does not work.
Uncomment blendMode modifier above to get gradient blend, but text is not correct
*/
}
}
}
}
我也尝试将黑色到红色的 Rectangle 应用为 Scrollview 的背景,但这也无法解决问题。
ScrollView {
VStack (spacing: 50) {
ForEach((1...5).reversed(), id: \.self) {
item($0)
}
}
}
.background(
Rectangle()
.fill(RadialGradient(gradient: Gradient(colors: [Color.black, Color.red]), center: .topLeading, startRadius: 200, endRadius: 800))
)
在下面的图片中,我想要的外观在左侧 VStack 中。
No blend mode modifier on ScrollView
Blend mode modifier applied to Scrollview
知道如何解决这个问题吗?
我能想到的唯一一件事,这似乎很 hacky,基本上是创建两个 z-stacked 滚动视图,并仅将混合应用于需要它的滚动视图,然后将未混合的项目放在最顶部的滚动视图中。
但是,我认为这不可行,因为我看不到在两个滚动视图之间同步滚动。
【问题讨论】: