我正在编写一个视图,它允许通过在左/右级别图上拖动来选择平移值。它工作得很好,除了用户总是必须从头开始选择值,他们不能调整现有的值。
.gesture(
withAnimation(.easeInOut){
DragGesture()
.onChanged { dval in
withAnimation(.easeInOut(duration: 0.3)) {
self.valViewOpacity = 1.0
}
let drag = dval.translation.width * 0.35
let newValue = min(max((drag), -50), 50)
self.pan = newValue
}
.onEnded { value in
withAnimation(.easeInOut(duration: 2)) {
self.valViewOpacity = 0.0
}
}
}
)
正如您所看到的,我已经通过将拖动值减少到其宽度的1/3来降低拖动敏感度。从逻辑上讲,值的级数应该是0, .35, .7, 1...
,所以如果我在值10上结束最后一次拖动,我希望级数是10, 10.35, 10.7, 11...
但事实并非如此是10, 0, 50
!
我尝试将预先存在的值集成到代码中,将onChanged
闭包中的第2行修改为:
let drag = dval.translation.width * 0.35 + self.pan
我移动了它并使用了括号,但基本上每当我在代码中的任何地方放置+ self.pan
时,只要我开始拖动,值就会立即变为-50或50。我意识到不断增加是错误的逻辑,所以试图找到一个地方,这样做只有一次在开始时,但我不能使它坚持,显然阻力值总是绝对的。
这是线程问题吗?我使用Text()视图查看值:
private var valView: some View {
Text("\(self.pan)")
.bold()
.font(.custom("Varitronix", size: 39.0))
.foregroundColor(.green)
}
如何让我的拖动创建的值从现有值开始并从那里更改它?
1条答案
按热度按时间t8e9dugd1#
我意识到发生的事情是
pan
的值正在增加,所以如果我使用我把增加的值加回它本身,从而使它呈指数级增加!
为了解决这个问题,我将
pan
的初始值复制到panStartedAt
中,并将其添加到表达式中。这给了我开始时的偏移量,从那时起,值就被正确设置了。在drag.end之后,pan
有了一个新的值,所以下一个拖动操作从这里开始!瞧!我唯一不太引以为豪的是使用
boolean
--我更喜欢比标志绑定逻辑更有机的东西。哦,好吧,至少它运行得很完美...