Cambiar continuamente el valor de UILabel en la image en miniatura de UISlider

Tengo un UISlider (min 1, max 10). Quiero que su pulgar tenga UILabel un UILabel que continuamente actualiza y cambia su text al mover el pulgar de UISlider . Por lo tanto, tomé la image del pulgar del UISlider y agregué una UILabel , pero la label parece sobrescribirse sin borrar el valor anterior una vez que se mueve el pulgar.

 - (IBAction)SnoozeSliderValueChanged:(id)sender { UIImageView *handleView = [_snoozeSlider.subviews lastObject]; UILabel *label = [[UILabel alloc] initWithFrame:handleView.bounds]; label.text = [NSString stringWithFormat:@"%0.0f", self.snoozeSlider.value]; label.backgroundColor = [UIColor clearColor]; label.textAlignment = NSTextAlignmentCenter; [handleView addSubview:label]; } 

Inicialmente,

introduzca la descripción de la imagen aquí

Entonces, cuando comienzo a arrastrar,

introduzca la descripción de la imagen aquí

Quiero que la label borre el valor anterior y muestre el valor actual a medida que se mueve el pulgar. Cualquier ayuda es apreciada. ¡Gracias!

Su código agrega continuamente nuevas subvenciones. Eliminar las subvistas existentes con:

 [handleView.subviews makeObjectsPerformSelector:@(removeFromSuperview)]; 

Alternativamente, reutilice la label existente. Quizás usando una label y viewWithTag: para encontrar la label existente y actualizar (o crear si no se encuentra). La reutilización es más eficiente que la recreación.

  - (IBAction)SnoozeSliderValueChanged:(id)sender { //Get the Image View UIImageView *handleView = [_snoozeSlider.subviews lastObject]; // Get the Slider value label UILabel *label = (UILabel*)[handleView viewWithTag:1000]; // If the slider label not exist then create it and add it to the Handleview. So handle view will have only one slider value label, so no more memory issues & not needed to remove from superview. // Creation of object is Pain to iOS. So simply reuse it by creating only once. // Note that tag setting below, which will helpful to find out that view presents in later case if (label==nil) { label = [[UILabel alloc] initWithFrame:handleView.bounds]; label.tag = 1000; label.backgroundColor = [UIColor clearColor]; label.textAlignment = NSTextAlignmentCenter; [handleView addSubview:label]; } // Update the slider value label.text = [NSString stringWithFormat:@"%0.0f", self.snoozeSlider.value]; } 

Esto se debe a que, en cada evento de cambio de valor del control deslizante, está creando una nueva instancia de UILabel y agregando esto a la vista. Puede crear el UILabel una vez y en las llamadas subsiguientes, solo actualice el marco de la label y el text de la label como a continuación:

 UIImageView *handleView = [_snoozeSlider.subviews lastObject]; UILabel *label = (UILabel*)[handleView viewWithTag:10]; if (!label) { //Create new instance label = [[UILabel alloc] init]; label.backgroundColor = [UIColor clearColor]; label.textAlignment = NSTextAlignmentCenter; label.tag = 10; //Assign a tag so that you can get the instance from parentview next time [handleView addSubview:label]; } [label setFrame:handleView.bounds]; label.text = [NSString stringWithFormat:@"%0.0f", self.snoozeSlider.value]; 

He creado una Swift Class para un propósito similar. Su nombre es MBSliderView
Puede usarse tanto en storyboard como en código.

Tiene 2 modos de visualización para mostrar el valor actual del control deslizante.
En estado normal, muestra valor dentro del pulgar así: introduzca la descripción de la imagen aquí

Y cuando presiona el pulgar, muestra el valor actual de esta forma: introduzca la descripción de la imagen aquí

Desde el código se puede usar así:

 class ViewController: UIViewController { var sliderFromCode = MBSliderView() override func viewDidLoad() { super.viewDidLoad() // configure sliderFromCode sliderFromCode.frame = CGRect(x: 10, y: 300, width: self.view.frame.size.width - 20, height: 100) sliderFromCode.minValue = 0 sliderFromCode.maxValue = 10 sliderFromCode.currentValue = 3 sliderFromCode.step = 1 sliderFromCode.ignoreDecimals = true // default value sliderFromCode.animateLabel = true // default value sliderFromCode.delegate = self self.view.addSubview(sliderFromCode) } } 

y para recibir el valor del control deslizante, debe implementar MBSliderDelegate . Algo como esto:

 extension ViewController: MBSliderDelegate { func sliderView(_ sliderView: MBSliderView, valueDidChange value: Float) { print("sliderFromCode: \(value)") } } 

Aquí está el código de ejemplo completo.

Sé muy tarde para responder, pero espero que esto te ayude a ti oa otra persona.