debugging 如何使用拖动手势编辑现有值?

pxyaymoc  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(159)

我正在编写一个视图,它允许通过在左/右级别图上拖动来选择平移值。它工作得很好,除了用户总是必须从头开始选择值,他们不能调整现有的值。

.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)
  }

如何让我的拖动创建的值从现有值开始并从那里更改它?

t8e9dugd

t8e9dugd1#

我意识到发生的事情是pan的值正在增加,所以如果我使用

let drag = dval.translation.width * 0.35 + self.pan

我把增加的值加回它本身,从而使它呈指数级增加!
为了解决这个问题,我将pan的初始值复制到panStartedAt中,并将其添加到表达式中。这给了我开始时的偏移量,从那时起,值就被正确设置了。在drag.end之后,pan有了一个新的值,所以下一个拖动操作从这里开始!瞧!

.gesture(
      DragGesture(minimumDistance: 0.0)
        .onChanged { dval in
          withAnimation(.easeInOut(duration: 0.3)) {
            self.valViewOpacity = 1.0 // Fade in when dragging starts
          }
          if( first ) {
            self.panStartedAt = pan
            first = false
          }
          let drag = dval.translation.width * 0.35
          let newValue = min(max((Int(drag) + self.panStartedAt), -50), 50)
          self.pan = newValue
        }
        .onEnded { value in
          withAnimation(.easeInOut(duration: 2)) {
            self.valViewOpacity = 0.0
          }
          first = true
        }
    )

我唯一不太引以为豪的是使用boolean--我更喜欢比标志绑定逻辑更有机的东西。哦,好吧,至少它运行得很完美...

相关问题