Установка отметок для UISlider - PullRequest
4 голосов
/ 01 апреля 2010

Существует ли какой-либо способ установки меток для 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 ]

5 голосов
/ 01 апреля 2010

UISlider не имеет никаких отметок.

Чтобы получить указанное вами поведение, вам нужно округлить число, возвращаемое ползунком, до ближайшего целого числа.

Так что, когдаВы начинаете скользить, и ползунок сообщает значение 0,1 или 0,2, округляя это до 0. Пока оно не достигнет 0,5, когда вы округлите до 1.

Затем, когда ползунок перестанет скользить, вы можете установить его значениедо числа, к которому вы округлили, что заставит ползунок «защелкнуться» в этом положении, вроде привязки к отметке.

Если вы хотите визуальные отметки, вам придется реализовать это самостоятельно.

3 голосов
/ 26 апреля 2013

Да, я думаю, что подклассы - это путь. Вот что я сделал:

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
1 голос
/ 17 января 2015

Как и выше, приведение к 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];
}

@ конец

0 голосов
/ 01 апреля 2010

Я просто бросил [slider value] в int, чтобы добиться этого.

...