UISlider, который привязывается к фиксированному числу шагов (например, Размер текста в приложении настроек iOS 7)

Я пытаюсь создать UISlider который позволяет вам выбирать из массива чисел. Каждое положение ползунка должно быть равноудаленным, а ползунок должен располагаться в каждом положении, а не плавно перемещаться между ними. (Это поведение ползунка в Settings > « General > « Text Size , который был введен в iOS 7.)

Ползунок размера текста iOS 7

Числа, которые я хочу выбрать: -3, 0, 2, 4, 7, 10, and 12.

(Я очень новичок в Objective-C, поэтому полный пример кода будет намного полезнее, чем фрагмент кода. =)

4 Solutions collect form web for “UISlider, который привязывается к фиксированному числу шагов (например, Размер текста в приложении настроек iOS 7)”

Некоторые из других ответов работают, но это даст вам одинаковое фиксированное пространство между каждой позицией вашего слайдера. В этом примере вы обрабатываете позиции ползунка как индексы для массива, который содержит фактические числовые значения, которые вас интересуют.

 @interface MyViewController : UIViewController { UISlider *slider; NSArray *numbers; } @end @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; slider = [[UISlider alloc] initWithFrame:self.view.bounds]; [self.view addSubview:slider]; // These number values represent each slider position numbers = @[@(-3), @(0), @(2), @(4), @(7), @(10), @(12)]; // slider values go from 0 to the number of values in your numbers array NSInteger numberOfSteps = ((float)[numbers count] - 1); slider.maximumValue = numberOfSteps; slider.minimumValue = 0; // As the slider moves it will continously call the -valueChanged: slider.continuous = YES; // NO makes it call only once you let go [slider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; } - (void)valueChanged:(UISlider *)sender { // round the slider position to the nearest index of the numbers array NSUInteger index = (NSUInteger)(slider.value + 0.5); [slider setValue:index animated:NO]; NSNumber *number = numbers[index]; // <-- This numeric value you want NSLog(@"sliderIndex: %i", (int)index); NSLog(@"number: %@", number); } 

Надеюсь, это поможет, удачи.

Ответ по сути тот же в этом ответе на UISlider с шагом 5

Чтобы изменить его для работы в вашем случае, вам нужно создать функцию округления, которая возвращает только значения, которые вы хотите. Например, вы можете сделать что-то простое (хотя и взломанное):

 -(int)roundSliderValue:(float)x { if (x < -1.5) { return -3; } else if (x < 1.0) { return 0; } else if (x < 3.0) { return 2; } else if (x < 5.5) { return 4; } else if (x < 8.5) { return 7; } else if (x < 11.0) { return 10; } else { return 12; } } 

Теперь используйте ответ из предыдущего сообщения, чтобы округлить значение.

 slider.continuous = YES; [slider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; 

Наконец, внесите изменения:

 -(void)valueChanged:(id)slider { [slider setValue:[self roundSliderValue:slider.value] animated:NO]; } 

Если у вас есть регулярные пробелы между шагами, вы можете использовать его как это для значения 15 :

 @IBAction func timeSliderChanged(sender: UISlider) { let newValue = Int(sender.value/15) * 15 sender.setValue(Float(newValue), animated: false) } 

Подобный подход, как PengOne, но я сделал ручное округление, чтобы было более ясно, что происходит.

 - (IBAction)sliderDidEndEditing:(UISlider *)slider { // default value slider will start at float newValue = 0.0; if (slider.value < -1.5) { newValue = -3; } else if (slider.value < 1) { newValue = 0; } else if (slider.value < 3) { newValue = 2; } else if (slider.value < 5.5) { newValue = 4; } else if (slider.value < 8.5) { newValue = 7; } else if (slider.value < 11) { newValue = 10; } else { newValue = 12; } slider.value = newValue; } - (IBAction)sliderValueChanged:(id)sender { UISlider *slider = sender; float newValue = 0.0; if (slider.value < -1.5) { newValue = -3; } else if (slider.value < 1) { newValue = 0; } else if (slider.value < 3) { newValue = 2; } else if (slider.value < 5.5) { newValue = 4; } else if (slider.value < 8.5) { newValue = 7; } else if (slider.value < 11) { newValue = 10; } else { newValue = 12; } // and if you have a label displaying the slider value, set it [yourLabel].text = [NSString stringWithFormat:@"%d", (int)newValue]; } 
  • Создание статической библиотеки с кокоаподами
  • Приложение Fresh SpeakHere имеет ошибку при записи звука в Simulator / Xcode
  • Какая ошибка udivmodsi4?
  • Цель C: проблема с предысторией и рамкой во время изменения ориентации
  • Проект Xcode застрял «Компиляция исходных файлов Swift»
  • генерация исключений при генерации объектов, прерывание при анализе проекта XCode
  • Как использовать новый проект для обновления существующего приложения?
  • Имитировать параметры запуска
  • Отладка Verilone E315 POS Sled на xcode
  • lldb точка останова для всех методов в объекте класса c
  • xcodebuild код для создания предупреждений об ошибках, даже если все профили находятся в правильной папке
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.