Установка галочки для 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 на основе приведенного выше примера.

Любая помощь??


person Mithun Nair    schedule 01.04.2010    source источник


Ответы (4)


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

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

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

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

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

person Jasarien    schedule 01.04.2010
comment
Спасибо за ответы и время ... На самом деле я настраиваю свой слайдер и помещаю полосу изображения в качестве изображения дорожки на слайдер. Поэтому, когда мой слайдер скользит, выбирается другое изображение. Итак, при 0 одно изображение, 1 другое изображение, 2 другое изображение ... вот так ... Но теперь, поскольку ползунок перемещается от 0,1 до ›0,2 и т.д ... В это время ничего не происходит. На самом деле я этого не хочу. NSSLider делает это именно так, как я хочу. Любой обходной путь для этого. - person Mithun Nair; 01.04.2010
comment
UISlider не является прямым портом NSSlider, поэтому похоже, что вам придется создать подкласс UISlider и реализовать поведение самостоятельно. - person Jasarien; 01.04.2010

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

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
person Spencer Hall    schedule 26.04.2013

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

@конец

person Martin-Gilles Lavoie    schedule 17.01.2015

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

person gammelgul    schedule 01.04.2010
comment
Приведение к типу int приведет к усечению значения, поэтому значение типа 0,99 станет 0. Лучшим вариантом будет округление до ближайшего целого числа. - person Jasarien; 01.04.2010
comment
Спасибо за ответы и время ... На самом деле я настраиваю свой слайдер и помещаю полосу изображения в качестве изображения дорожки на слайдер. Поэтому, когда мой слайдер скользит, выбирается другое изображение. Итак, при 0 одно изображение, 1 другое изображение, 2 другое изображение ... вот так ... Но теперь, поскольку ползунок перемещается от 0,1 до ›0,2 и т.д ... В это время ничего не происходит. На самом деле я этого не хочу. NSSLider делает это именно так, как я хочу. Любой обходной путь для этого. - person Mithun Nair; 01.04.2010