代码之家  ›  专栏  ›  技术社区  ›  user4992124

将循环连续UISlider值转换为计数器

  •  0
  • user4992124  · 技术社区  · 6 年前

    在我的应用程序中,我创建了一个圆形、连续可滑动的圆形滑块( this one ). 它有一个 minimumValue 1.0和a maximumValue 共10个。现在,我希望我的用户能够继续在圆圈中滑动,以增加 NSInteger 在应用程序中的某个位置使用。

    我试图通过编写下面的代码来做到这一点。

    - (void)sliderChanged:(UICircularSlider *)slider {
        int val = (int)slider.value;
        slider.value = val;
        int delta = val - self.oldValue;
    
        if (self.oldValue == self.circularSlider.maximumValue && val == 0) {
            delta = 1;
        }
    
        self.number += delta;
    
        self.oldValue = val;
    }
    

    这是可行的,但实际上是草图。有时,该值会下降10,这是由于滑块给我的值为10,之后的值为0。如果用户开始向后拖动,并且数字开始减少,那么它也不起作用。我想知道是否有更好的方法来实现同样的目标。有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   LGP    6 年前

    我认为更好的方法是首先找出用户移动的方向。这可以通过检查新位置和旧位置之间距离最近的方向来实现。必须注意检查是否通过边境。然后,只需根据方向调整增量即可。

    我的解决方案代码假定滑块从 ,我建议您使用它而不是1,因为计算更简单。如果你真的想从1开始,它可以调整。我还将最大值定义为常数 SLIDER_MAX_VALUE ,您可以将其改为变量。最后,我改变了 self.number 到a CGFloat ,那么在 使用 而是数字。这是 重要的 ,否则滑动时会出现舍入错误。如果您确实想要一个整数,请使用两个变量,并从浮点中指定整数变量。

    #define SLIDER_MAX_VAL 10
    
    - (void)sliderChanged:(UICircularSlider *)slider {
        CGFloat delta = slider.value - self.oldValue;
        if ((delta > 0 && delta < SLIDER_MAX_VAL / 2) ||
            (delta < 0 && delta < -SLIDER_MAX_VAL / 2)) {
            // Moving forward
            if (delta < 0)
                delta += SLIDER_MAX_VAL;
        } else {
            // Moving backward
            if (delta > 0)
                delta -= SLIDER_MAX_VAL;
        }
    
        self.number += delta; // Change to CGFloat
        self.oldValue = slider.value;
    }