连续更改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)") } }
这里是完整的示例代码。
我知道它很晚才能回答,但希望这可以帮助你或其他人