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]; } 
  • Admob Reward Video GADRewardBasedVideoAd в Objective c IOS
  • Экспортировать ошибку IPA на Xcode 7 в El Capitan
  • Могу ли я сортировать схемы и целевые списки в алфавитном порядке в Xcode?
  • Основные данные, получающие данные от одного до многих отношений
  • Как имитировать состояние дискового пространства на устройствах iOS?
  • почему UITextView рисует текст в плохом кадре после изменения размера?
  • Ошибка сборки XCode unittest с ошибкой «Неопределенные символы для архитектуры x86_64»
  • Как установить и получить значение указателя Swift
  • Нет такого файла и каталога, который нашел Xcode 7
  • Xcode не удается установить приложение после обновления iOS8.4 и Xcode 6.4
  • Первый запуск iOS - обнаружение, если приложение запущено в первый раз
  • Interesting Posts

    Как получить название выбранной кнопки UIActionSheet в ярлыке?

    iOS, как узнать, что автокоррекция или предсказательная типизация заменят текст в UITextView?

    Пользовательский ряд в Эврика

    Различные ошибки ITMS при попытке отправить архив в App Store

    NSPredicate против NSString: что лучше / быстрее для поиска суперструн?

    дешифровать значение от blowfish в коде Objective-C

    Как переключить UILabel между редактируемыми и нередактируемыми

    Бросить тень на все узлы SCNLight

    iOS crash CoreData: ошибка: (19) ПЕРВИЧНЫЙ КЛЮЧ должен быть уникальным

    Ошибка выполнения UI Automation из командной строки

    UIF обратной связи Haptic Engine вызывали больше раз, чем было активировано

    Почему модальное представление контроллера представления прерывает автоматическую компоновку в моем представлении таблицы?

    Вызов и печать объекта внутри объекта в swift 2

    iOS: не удается получить содержимое каталога Caches

    Как назначить действие для объекта UIImageView в Swift

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.