usado para marcar dispositivo configurar como ios objective-c iphone xcode uislider

marcar - dispositivo ios para pc



UISlider que se ajusta a un número fijo de pasos(como Tamaño de texto en la aplicación de configuración de iOS 7) (4)

Algunas de las otras respuestas funcionan, pero esto le dará el mismo espacio fijo entre cada posición en su control deslizante. En este ejemplo, trata las posiciones del control deslizante como índices de una matriz que contiene los valores numéricos reales que le interesan.

@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); }

Espero que eso ayude, buena suerte.

Editar: Aquí hay una versión en Swift 4 que subcategoría UISlider con devoluciones de llamada.

class MySliderStepper: UISlider { private let values: [Float] private var lastIndex: Int? = nil let callback: (Float) -> Void init(frame: CGRect, values: [Float], callback: @escaping (_ newValue: Float) -> Void) { self.values = values self.callback = callback super.init(frame: frame) self.addTarget(self, action: #selector(handleValueChange(sender:)), for: .valueChanged) let steps = values.count - 1 self.minimumValue = 0 self.maximumValue = Float(steps) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } @objc func handleValueChange(sender: UISlider) { let newIndex = Int(sender.value + 0.5) // round up to next index self.setValue(Float(newIndex), animated: false) // snap to increments let didChange = lastIndex == nil || newIndex != lastIndex! if didChange { let actualValue = self.values[newIndex] self.callback(actualValue) } } }

UISlider crear un UISlider que te permita elegir entre una matriz de números. Cada posición del control deslizante debe ser equidistante y el control deslizante debe ajustarse a cada posición, en lugar de deslizarse suavemente entre ellas. (Este es el comportamiento del control deslizante en Settings > General > Text Size , que se introdujo en iOS 7.)

Los números que deseo elegir son: -3, 0, 2, 4, 7, 10, and 12.

(Soy muy nuevo en Objective-C, por lo que un ejemplo de código completo sería mucho más útil que un fragmento de código. =)


Enfoque similar al de PengOne, pero hice el redondeo manual para dejar más claro lo que estaba sucediendo.

- (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]; }


La respuesta es esencialmente la misma en esta respuesta a UISlider con incrementos de 5

Para modificarlo para que funcione en su caso, deberá crear una función de redondeo que solo devuelva los valores que desea. Por ejemplo, podrías hacer algo simple (aunque hacky) como este:

-(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; } }

Ahora usa la respuesta de la publicación anterior para redondear el valor.

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

Finalmente, implemente los cambios:

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


Si tiene espacios regulares entre pasos, puede usarlo de esta manera para 15 valores:

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