连续更改UISlider的拇指图像上的UILabel的值

我有一个UISlider (最less1,最多10)。 我希望它的拇指有一个UILabel放在它的顶部,不断更新和改变其移动UISlider的拇指的文字。 所以,我从UISlider了一个UILabel图像,并添加了一个UILabel ,但是标签似乎覆盖了它自己,而没有删除之前的值。

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

原来,

在这里输入图像说明

然后,当我开始拖动,

在这里输入图像说明

我希望标签可以删除以前的值,并在拇指移动时显示当前值。 任何帮助表示赞赏。谢谢!

您的代码不断添加新的子视图。 删除现有的子视图:

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

或者,重新使用现有的标签。 也许使用一个标签和viewWithTag:find现有的标签并更新(或创build如果没有find)。 重用比娱乐更有效率。

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

这是因为,在每个滑块值更改的事件,您正在创build新的UILabel实例,并添加到此视图。 你可以创buildUILabel一次,随后的调用,只需更新标签框架和标签文本如下所示:

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

我创build了一个类似的Swift类。 它的名字是MBSliderView
它可以在故事板和代码中使用。

它有2种显示当前滑块值的显示模式。
在正常状态下,它显示如下的价值: 在这里输入图像说明

当按下拇指时,它会显示如下的当前值: 在这里输入图像说明

从代码中可以这样使用:

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

并且为了接收滑块值,您必须实现MBSliderDelegate 。 像这样的东西:

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

这里是完整的示例代码。

我知道它很晚才能回答,但希望这可以帮助你或其他人