我想沿着Y轴拖动图像。看起来很简单。但是我错误地把"偏移量"放在了"手势"后面。然后CPU全速运行,UI变得没有React。
把"offset"放在"gesture"前面就可以了,但是我想不通。
struct ContentView: View {
@State private var currentPosition: CGSize = .zero
@State private var newPosition: CGSize = .zero
var body: some View {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
// .offset(x: currentPosition.width, y: currentPosition.height)
.gesture(DragGesture()
.onChanged { value in
print("DragEffectViewModifier-ondrag")
currentPosition = CGSize(width: 0, height: value.translation.height + newPosition.height)
}
.onEnded { value in
newPosition = currentPosition
})
.offset(x: currentPosition.width, y: currentPosition.height)
}
}
编辑:
"DragEffectViewModifier-ondrag"反复显示在控制台上,是什么导致了"循环行为"?当"offset"放在"gesture"下面时,会使cpu全速运行,UI无响应
1条答案
按热度按时间pbpqsu0x1#
我离开系统尝试您的代码,但看着它,我认为类似的事情正在发生...创建结构,一旦创建,状态变量被初始化,这导致主体变量被求值,在它被求值时,DragGesture也被重新创建并初始化其onChanged,这重写了currentPostion,这导致主体变量被重新求值,它重新创建了拖拽手势等等。
为了证实或否定我的推理,我将把DragGesture移动到body外部的var,然后将手势注入为. gesture(dragGesture)之类的内容。这似乎是我在手势使用示例中看到的模式。其思想是将手势作为半单例,而不是每次计算body var时重新创建新的手势。
只是猜猜。
好的.....我上面的回答是BS(考虑不周)......我试过你的代码,完全按照你的描述。正确的是SwiftUI: Error in dragging logic or is this a bug?
这就解释了它与偏移和拖动操作的坐标空间有关。
TL; DR将DragGesture创建更改为
而且它的工作原理和预期的一样。