Горизонтальный слайдер с отметками на iOS - PullRequest
4 голосов
/ 08 февраля 2012

Могу ли я реализовать горизонтальный слайдер с отметками на iOS? Такой опции нет, как в MacOS.

Ответы [ 3 ]

3 голосов
/ 12 марта 2013

На самом деле я написал учебное пособие о том, как это сделать на веб-сайте моей компании:

http://fragmentlabs.com/blog/making-talking2trees-part-3-77

Быстрый ответ на этот вопрос - пользовательский метод, который я написал, и который объясняется встатья выше:

-(UIView*)tickMarksViewForSlider:(UISlider*)slider View:(UIView *)view
{
// set up vars
int ticksDivider = (slider.maximumValue > 10) ? 10 : 1;
int ticks = (int) slider.maximumValue / ticksDivider;
int sliderWidth = 364;
float offsetOffset = (ticks < 10) ? 1.7 : 1.1;
offsetOffset = (ticks > 10) ? 0 : offsetOffset;
float offset = sliderWidth / ticks - offsetOffset;
float xPos = 0;

// initialize view to return
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y+1,
    slider.frame.size.width, slider.frame.size.height);
view.backgroundColor = [UIColor clearColor];

// make a UIImageView with tick for each tick in the slider
for (int i=0; i < ticks; i++)
{
    if (i == 0) {
        xPos += offset+5.25;
    }
    else
    {
        UIView *tick = [[UIView alloc] initWithFrame:CGRectMake(xPos, 3, 2, 16)];
        tick.backgroundColor = [UIColor colorWithWhite:0.7 alpha:1];
        tick.layer.shadowColor = [[UIColor whiteColor] CGColor];
        tick.layer.shadowOffset = CGSizeMake(0.0f, 1.0f);
        tick.layer.shadowOpacity = 1.0f;
        tick.layer.shadowRadius = 0.0f;
        [view insertSubview:tick belowSubview:slider];
        xPos += offset - 0.4;
    }
}

// return the view
return view;
}

Вы бы в основном применили этот метод к представлению, которое находится позади вашего UISlider, и оно создает отметки в соответствующие интервалы.Вы можете изменить количество видимых тиков, изменив переменную ticksDivider.В приведенном выше примере создается одно значение для каждого слайдера, если только свойство MaximumValue этого слайдера не превышает 10 (у моих слайдеров были значения 5, 40 и 120), и в этом случае я разделил это значение на 10.

Вы должны игратьсо значением offsetOffset и значением с плавающей запятой после xPos += offset+... для учета ширины изображения большого пальца и вставок крышки ползунка (поэтому кнопка большого пальца, кажется, центрирована по каждому).

2 голосов
/ 14 марта 2015

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

Мое решение приведено ниже.Это подкласс UISlider, который переопределяет только два метода.Это голые кости, но было бы основой для более сложной версии.

-(void)endTrackingWithTouch:(UITouch *)touch
                  withEvent:(UIEvent *)event
{
    [super endTrackingWithTouch:touch withEvent:event];
    if (self.value != floorf(self.value))
    {
        CGFloat roundedFloat = (float)roundf(self.value);
        [self setValue:roundedFloat animated:YES];
    }
}

-(void)drawRect:(CGRect)rect
{    
    CGFloat thumbOffset = self.currentThumbImage.size.width / 2.0f;
    NSInteger numberOfTicksToDraw = roundf(self.maximumValue - self.minimumValue) + 1;
    CGFloat distMinTickToMax = self.frame.size.width - (2 * thumbOffset);
    CGFloat distBetweenTicks = distMinTickToMax / ((float)numberOfTicksToDraw - 1);

    CGFloat xTickMarkPosition = thumbOffset; //will change as tick marks are drawn across slider
    CGFloat yTickMarkStartingPosition = self.frame.size.height / 2; //will not change
    CGFloat yTickMarkEndingPosition = self.frame.size.height; //will not change
    UIBezierPath *tickPath = [UIBezierPath bezierPath];
    for (int i = 0; i < numberOfTicksToDraw; i++)
    {
        [tickPath moveToPoint:CGPointMake(xTickMarkPosition, yTickMarkStartingPosition)];
        [tickPath addLineToPoint:CGPointMake(xTickMarkPosition, yTickMarkEndingPosition)];
        xTickMarkPosition += distBetweenTicks;
    }
    [tickPath stroke];
}
1 голос
/ 09 февраля 2012

От @CarlGoldsmith - вам придется программировать это самостоятельно; UISliders на iOS не имеет такой функциональности.

...