ios 在手势后放置偏移量时,cpu全速运行

zdwk9cvp  于 2023-02-26  发布在  iOS
关注(0)|答案(1)|浏览(183)

我想沿着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无响应

pbpqsu0x

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创建更改为

.gesture(DragGesture(coordinateSpace: .global)

而且它的工作原理和预期的一样。

相关问题