gpt4 book ai didi

scrollview - SwiftUI - 根据 ScrollView 的位置更改 View 的不透明度

转载 作者:行者123 更新时间:2023-12-05 03:56:15 25 4
gpt4 key购买 nike

这更像是一个“是否可能”的问题。

我目前有一个 float 的自定义导航栏,它位于自己的父容器中,背景为白色,不透明度为 0%。在 scrollView 滚动经过 ScrollView 中的英雄图像后,我想将该父容器的不透明度从 0% 更改为 50%。

var body: some View {
ZStack {
ScrollView(.vertical, showsIndicators: false) {
GeometryReader { geometry in
ZStack{
if geometry.frame(in: .global).minY <= 0 {
Image(self.venueImage)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: geometry.size.width, height: geometry.size.height)
.offset(y: geometry.frame(in: .global).minY/9)
.clipped()
} else {
Image(self.venueImage)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: geometry.size.width, height: geometry.size.height + geometry.frame(in: .global).minY)
.clipped()
.offset(y: -geometry.frame(in: .global).minY)
}
}
}.frame(height: 300)
VStack {
HStack {
Text(self.title)
.font(.title)
.fontWeight(.bold)
Spacer()
}.padding(.horizontal, 24)
HStack {
Text(self.venueArea)
.foregroundColor(Color("bodyText"))
Spacer()
}.padding(.horizontal, 24)

VStack {
ForEach(self.venueProd) { gc in

VStack {
HStack {
Text(gc.title)
.font(.system(size: 17))
.fontWeight(.semibold)
Spacer()
}
HStack {
Text(gc.productDescription)
.foregroundColor(Color("bodyText"))
.font(.system(size: 15))
.padding(.top, 5)
Spacer()
}
HStack {
Text("$\(gc.productPrice, specifier: "%.2f")")
Spacer()
}.padding(.top, 8)
Divider()
}.padding(.bottom, 8)

}
Spacer()
}.padding(.horizontal, 24)
.padding(.top, 24)
.padding(.bottom, 60)
Spacer()
}
}.edgesIgnoringSafeArea(.top)

// AREA I'M TRYING TO MODIFY OPACITY ON SCROLL
ZStack {

GeometryReader { geometry in
ZStack {
VStack {
Text("")
.frame(width: geometry.size.width, height: 120)
.background(Color.white)
.opacity(0.3 )
Spacer()
}
}.edgesIgnoringSafeArea(.top) // Ends ZStack
} // Ends Geometry Reader

VStack {
GeometryReader { gr in
HStack {
Button(action: {self.presentationMode.wrappedValue.dismiss()}) {
Image(systemName: "chevron.left")
.foregroundColor(.black)
.padding(.leading, 16)
HStack {
Text("Venues · Venue Details")
.font(.system(size: 15))
.fontWeight(.bold)
.foregroundColor(Color.black)

.padding()
Spacer()
}
}.frame(width: gr.size.width * 0.92, height: 48)
.background(Color.white)
.cornerRadius(8)

}.padding(.leading, 16)
Spacer()
}
}
.padding(.top, 50)
.edgesIgnoringSafeArea(.top)
} // Ends Floating Menu ZStack

} // Second ZStack
}

最佳答案

这是一个想法的演示。

enter image description here

代码只是展示了方法,由于简单,它可以很容易地集成/传输。所有背景颜色只是为了更好的可见性,以及计算可能更复杂并包含动画,但想法保持不变 - 可以使用 GeometryProxy 并根据需要读取全局坐标中的图像矩形通过相应的 @State 改变一些其他 View 的不透明度。

struct TestScrollDependentOpacity: View {

@State private var barOpacity: Double = 0

var body: some View {
ZStack(alignment: .top) {
mainContent
floatingBar
}
}

private var mainContent: some View {
ScrollView {
GeometryReader { g -> AnyView in
let rect = g.frame(in: .global)
DispatchQueue.main.async {
self.barOpacity = rect.maxY < 0 ? 0.5 : 0.0
}
return AnyView(Image(systemName: "sun.max")
.resizable()
.aspectRatio(contentMode: .fit)
.position(x: g.size.width / 2.0, y: g.size.height / 2.0))
}
.frame(height: 100).background(Color.yellow)

VStack(alignment: .leading) {
ForEach (0..<40) { i in
HStack {
Text("Text \(i)").padding()
Spacer()
}
}
}.background(Color.green)
}
}

private var floatingBar: some View {
HStack {
Button("Left") { }
Spacer()
Button("Right") { }
}
.padding()
.background(Color.white.opacity(barOpacity))
.edgesIgnoringSafeArea(.top)
}
}

关于scrollview - SwiftUI - 根据 ScrollView 的位置更改 View 的不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59556127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com