是否有任何为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。
任何帮助??
答案 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来实现此目的。