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