在 UISlider 的缩略图上不断更改 UILabel 的值

Posted

技术标签:

【中文标题】在 UISlider 的缩略图上不断更改 UILabel 的值【英文标题】:Continuously change value of UILabel on thumb image of UISlider 【发布时间】:2014-03-13 08:30:24 【问题描述】:

我有一个UISlider(最少 1 个,最多 10 个)。我希望它的拇指在其顶部放置一个UILabel,它会在移动UISlider 的拇指时不断更新和更改其文本。因此,我从UISlider 中抓取了拇指图像,并在其中添加了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];


最初,

然后,当我开始拖动时,

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

【问题讨论】:

最初,您是指在您第一次实际触摸滑块之后?因为最初,意思是在创建UISlider 之后,它没有子视图,所以这个方法不适用于在第一次实际触摸滑块之前创建标签... 【参考方案1】:
    - (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];

    

【讨论】:

检查更新的代码和描述。这将提高您的性能,而不是 removefromsuperview 方法 清除!但是,一旦我转到其他视图并返回此视图,我注意到 UILabel 不会再次初始化,并且像往常一样,标签会尝试自我更新。奇怪的是,当我记录标签时,我注意到标签值发生了应有的变化,但正在运行的应用程序中的标签不再变化 尝试@"%.0f" 而不是@"%0.0f"【参考方案2】:

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

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

或者,重用现有标签。也许使用标签和viewWithTag: 来查找现有标签并更新(如果未找到则创建)。重复使用比娱乐更有效。

【讨论】:

【参考方案3】:

这是因为,在每个滑块值更改事件中,您都在创建新的 UILabel 实例并将其添加到视图中。您可以只创建一次UILabel,然后在后续调用中更新标签框架和标签文本,如下所示:

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

【讨论】:

【参考方案4】:

为了类似的目的,我创建了一个 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)")
    

Here 是完整的示例代码。

我知道现在回答很晚,但希望这对您或其他人有所帮助

【讨论】:

当时没有 swift :/ @motox 很快!

以上是关于在 UISlider 的缩略图上不断更改 UILabel 的值的主要内容,如果未能解决你的问题,请参考以下文章

根据 UISlider 值不断更新标签

如何正确创建带有 UISlider 的缩略图选择器以从视频中进行选择?

自定义 UISlider 无法正确设置最小轨道颜色

如何在 YouTube 缩略图上叠加播放按钮

Jquery在缩略图上设置不透明度动画,除了选中的那个

时间戳未打印在 FFMPEG 的缩略图上