【问题标题】:Setting interval value for UISlider设置 UISlider 的间隔值
【发布时间】:2011-04-11 06:37:48
【问题描述】:

我需要为 UISlider 设置间隔值。

请帮忙..

【问题讨论】:

    标签: iphone objective-c uislider


    【解决方案1】:

    yourSlider.value = x;

    你真的应该阅读文档,iOS Developer Center 中有很多很棒的资源。

    编辑:关于您在 cmets 中更具体的问题:

    yourSlider.minimumValue = -10;
    yourSlider.maximumValue = 10;
    [yourSlider addTarget:self action:@selector(roundValue) forControlEvents:UIControlEventValueChanged];
    
    - (void)roundValue{
        yourSlider.value = round(yourSlider.value);
    }
    

    【讨论】:

    • 哦是这样..我知道如何设置值..我需要设置增量间隔..如果滑块范围从-10到10..n我希望增量间隔为 0.5... 那么我该如何设置间隔..
    • UIControlEvenValueChanged 上,你将slider.value 取整。
    • 迈克,谢谢 dat 很有用.. 滑块现在以所需的间隔递增,但滑块球一直在抖动.. :(
    • 我很困惑你到底想做什么。如果您希望滑块平滑但只返回四舍五入的结果,只需使用 round(yourSlider.value) 并跳过所有其余部分。
    • 哇,这个解决方案对我来说简直是崩溃了。以未捕获的异常终止。认为这是事件处理程序需要一个(id)发件人参数......是的,将- (void)roundValue{更改为- (void)roundValue:(id)sender{
    【解决方案2】:

    灵活的解决方案:

        // define MIN_VALUE, MAX_VALUE and INTERVAL somewhere, such as 3, 18 and 3
    
        slider.TouchUpInside += delegate {
            touchUpInside();
        };
    
        /// <summary>
        /// set value to one of intervals
        /// </summary>
        void touchUpInside(){
    
            // get the nearest interval value
            for(int i=MIN_VALUE; i<=MAX_VALUE; i=i+INVERVAL){
    
                if(slider.Value > i && slider.Value < i + INVERVAL){
                    if(slider.Value - i < i + INVERVAL - slider.Value){
                        slider.Value = i;
                    }else{
                        slider.Value = i + INVERVAL;
                    }
    
                    break;
                }
            }           
        }
    

    【讨论】:

    • 感谢 Genc,它真的对我有用。你只是节省了我很多时间:)
    【解决方案3】:

    我知道这个问题很老,但我只是想分享一下我是如何做到的。

    假设UISlider对象已经被初始化,首先要设置UISlider对象的最小值和最大值:

    mySlider.minimumValue = -2.0;
    mySlider.maximumValue = 2.0;
    

    然后,设置将处理滑块变化的选择器:

    [mySlider addTarget:self action:@selector(sliderDidChangeValue:) forControlEvents:UIControlEventValueChanged];
    

    另外,设置间隔(到一个属性)。间隔是正数很重要。 (而且,真的,间隔必须是正的。)

    self.interval = 0.5 //_interval is float
    

    声明方法:

    - (void)sliderDidChangeValue:(id)sender
    {
        UISlider *slider = (UISlider *)sender;
    
        //Round the value to the a target interval
        CGFloat roundedValue = [self roundValue:slider.value];
    
        //Snap to the final value
        [slider setValue:roundedValue animated:NO];
    }
    
    - (float)roundValue:(float)value
    {
        //get the remainder of value/interval
        //make sure that the remainder is positive by getting its absolute value
        float tempValue = fabsf(fmodf(value, _interval)); //need to import <math.h>
    
        //if the remainder is greater than or equal to the half of the interval then return the higher interval
        //otherwise, return the lower interval
        if(tempValue >= (_interval / 2.0)){
            return value - tempValue + _interval;
        }
        else{
            return value - tempValue;
        }
    }
    

    【讨论】:

      【解决方案4】:
      int sliderValue =  kSliderInterval * floor((slider.value / kSliderInterval) + 0.5);
      

      【讨论】:

        【解决方案5】:

        UISliders 不会“增加”它们的价值,它们会根据触摸的方式增加或减少其价值。您可以使用这些属性来设置滑块限制:

        slider.minimumValue = 0.0;
        slider.maximumValue = 0.5;
        

        【讨论】:

          【解决方案6】:

          我建议将级别放在要放置值的滑块下方并设置最大值和最小值,然后可以通过点数和除法计算中间值,最后在 uilabel 中显示值。 希望这会有所帮助

          祝你好运

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-09
            • 1970-01-01
            • 1970-01-01
            • 2014-10-05
            • 1970-01-01
            • 2020-06-21
            • 1970-01-01
            相关资源
            最近更新 更多