我有一个View,其中的元素具有拖动手势,效果很好。但是,我试图使用修饰符函数将整个内容放入ZStack中,并可选地在其之上显示其他内容。如果我使用additionalView
修饰符,则拖动手势将停止工作。我什至尝试将其与EmptyView()
配合使用,并且还尝试仅返回body
中的additionalView
,拖动手势无效。由于某些原因,translation
变量未在DragGesture.updating
中更新,但是value
的值正确。也尝试使用@State
而不是@GestureState
并手动进行更新,但这也不起作用。也许不使用用于呈现可选视图的函数,而是在视图的构造函数中使用可选的@ViewBuilder
参数并将ZStack放在正文中即可,但我更喜欢这种方法。
struct DragTest: View {
@GestureState private var translation: CGFloat = 0
var body: some View {
GeometryReader { geometry in
HStack(spacing: 0) {
Spacer()
Text("some text")
Spacer()
}
.frame(width: geometry.size.width, alignment: .leading)
.offset(x: self.translation)
.gesture(
DragGesture().updating(self.$translation) { value, state, _ in
state = value.translation.width
print(value.translation.width)
print(self.translation)
}
)
}
}
func additionalView<AdditionalView: View>(@ViewBuilder additionalView: @escaping () -> AdditionalView) -> some View {
ZStack {
self.body
additionalView()
}
}
}
struct ContentView: View {
var body: some View {
DragTest()
.additionalView {
EmptyView()
}
}
}