为UISlider设置刻度线

时间:2010-04-01 11:10:04

标签: iphone uislider

是否有任何为UISlider设置刻度线的方法。 NSSlider有一些叫做的东西 - (void)setNumberOfTickMarks:(NSInteger)numberOfTickMarks。但是UISlider似乎没有。

我想要做的是将滑块值设置为0,1,2,3,4等,如果我将min设置为0并将max设置为5.现在这样UISLider返回类似0.0,0.1,0.2的内容,基于我上面给出的例子,0.3等4.8,4.9,5.0。

任何帮助??

4 个答案:

答案 0 :(得分:5)

UISlider没有任何标记。

要获得您指定的行为,您必须将滑块返回的数字四舍五入到最接近的整数。

因此,当您开始滑动,并且滑块报告值为0.1或0.2时,将其舍入为0.直到它达到0.5,当您向上舍入为1.

然后当滑块停止滑动时,您可以将其值设置为您舍入到的数字,这将使滑块“捕捉”到该位置,类似于捕捉到刻度线。

如果你想要视觉标记,你必须自己实现。

答案 1 :(得分:3)

是的,我认为子类化是要走的路。这就是我所做的:

... TickSlider.h

/**
 * A custom slider that allows the user to specify the number of tick marks.
 * It behaves just like the NSSlider with tick marks for a MacOS app.
 **/
@interface TickSlider : UISlider

/**
 * The number of tickmarks for the slider. No graphics will be draw in this
 * sublcass but the value of the slider will be rounded to the nearest tick
 * mark in the same way/behaviour as the NSSlider on a MacOS app. 
 * @discussion This value can be set as a UserDefinedAttribute in the xib file.
 **/
@property (nonatomic) NSInteger numberOfTickMarks;

@end

... TickSlider.m

#import "TickSlider.h"

@implementation TickSlider



 - (void)setValue:(float)value animated:(BOOL)animated {
    float updatedValue = value;

    if (self.numberOfTickMarks > 0) {
        updatedValue = MAX(self.minimumValue, MIN(value, self.maximumValue));

        if (self.numberOfTickMarks == 1) {
            updatedValue = (self.minimumValue + self.maximumValue) * 0.5f;
        }
        else {
            const int kNumberOfDivisions = (self.numberOfTickMarks - 1);
            const float kSliderRange = ([self maximumValue] - [self minimumValue]);
            const float kRangePerDivision = (kSliderRange / kNumberOfDivisions);
            const float currentTickMark = roundf(value / kRangePerDivision);
            updatedValue = (currentTickMark * kRangePerDivision);
        }
    }

    [super setValue:updatedValue animated:animated];
}


@end

答案 2 :(得分:1)

如上所述,转换为int会使滑块的行为就像您在拇指旁边滑动一样。上面的股票代码很有趣,允许您指定更多"停止值" (滴答)作为最大值设置。

如果你需要一个简单的"整数滑块",舍入(值+ 0.25)实际上使滑块表现得非常好。这是我使用的代码:

@interface IntegerSlider : UISlider
@end

@implementation IntegerSlider

- (void) setValue: (float) value
         animated: (BOOL) animated
{
    value = roundf(value + 0.25);

    [super setValue: value
           animated: animated];
}

@end

答案 3 :(得分:0)

我只是将[slider value]转换为int来实现此目的。