如何获取给定值沿 UISlider 的位置?

Posted

技术标签:

【中文标题】如何获取给定值沿 UISlider 的位置?【英文标题】:How can I get the positions of given values along a UISlider? 【发布时间】:2013-05-05 04:06:47 【问题描述】:

我在UISlider--values 上有一个任意值数组,我想使用类似this approach 的东西作为刻度线/停止值,但在滑块框架本身中绘制。如何可靠地找到或计算这些值沿滑块在滑块框架内的像素/点位置?

强调一下:与How to get the center of the thumb image of UISlider不同,我需要滑块框架内的位置。

两个重要的信息是拇指的像素/点范围和该范围的原点。从这些信息中可以很容易地计算点位置。这是我尝试过的;这段代码是从viewDidLoad调用的:

CGRect bounds = slider.bounds;
CGRect trackRect = [slider trackRectForBounds:bounds];

//float thumbWidth = slider.currentThumbImage.size.width; // why does this give 0?
float thumbWidth = 23;

float thumb0 = 0.5 * thumbWidth; // left-most posn. of thumb center
float thumbRange =  trackRect.size.width - thumbWidth; // point range of thumb

float sliderValueMin = slider.minimumValue;
float sliderValueWidth = slider.maximumValue - sliderValueMin;
float pointsPerValueUnit = thumbRange/sliderValueWidth;

然后

float tickPos = pointsPerValueUnit * (tickValue - sliderValueMin) + thumb0;

理论上应该是正确的,不是吗?但是当我绘制靠近右侧的位置时,它们偏离了几个点。通过摆弄,我发现了一个可以提供(看起来是)正确结果的软糖......至少对于我当前的滑块配置:

float thumbRange =  trackRect.size.width - thumbWidth + 3.5;

我希望我的代码可重复用于不同的值范围、滑块大小、自定义拇指等,所以我有两个问题/疑问:

    为什么我需要这个~3.5 的软糖系数?它来自哪里,我如何知道它是否对所有滑块都相同? 为什么我无法从slider.currentThumbImage.size.width 中获取值?此参数在应用程序执行后具有值 - 当滑块的值更改时。* 如果不在 viewDidLoad 中,我应该何时绘制刻度线?

感谢您的帮助。


*同样适用于thumbWidth

    CGRect thumbPosition = [slider thumbRectForBounds:bounds trackRect:trackRect value:slider.value];
    thumbWidth = thumbPosition.size.width;

编辑

我很欣赏到目前为止我得到的答复,尽管从他们的角度来看,我似乎没有足够准确地提出我的问题。

正如我在 cmets 中提到的,我的想法是让这段代码可重用(并使其可供社区使用),因此开发人员只需将代码放在适当的位置,而不必四处寻找软糖他自己的滑块的因素。所以让我澄清一下问题#1

1'。有什么方法可以获得 3.5 或给定滑块配置的任何数字吗?例如,也许是滑块的参数(类似于thumbWidth),所以刻度线会自动正确对齐?

UISlider Class Reference 非常稀疏。阅读它,我绝不会期望slider.currentThumbImage.size.width; 不是nil。我在想 3.5-ish 软糖可能同样隐藏在 UISlider 的晦涩属性中。

实际上,重新阅读我刚刚写的内容可以为问题 #2 提供一个可能的答案。也许拇指的宽度没有设置,因为滑块还没有被绘制......这是对的吗?

【问题讨论】:

您可以以图形方式验证您的一些假设。例如,当您在 100% 和 0% 处绘制刻度线时会发生什么?如果你为bounds 绘制一个矩形呢? 谢谢,@nielsbot;感谢您的回复。您的建议实际上是我获得 3.5 的一部分。所以我的代码“有效”——至少对于给定的设置。可以这么说,我要做的是对其进行防弹,并使其对所有设置有用。我的目标是在 GitHub 上发布这项技术,因为我认为它可以帮助社区中的很多人。当然,如果每个人都不必摆弄软糖因素,而可以简单地使用它,那会更有帮助。 【参考方案1】:

“软糖因素”很可能是由于滑块的绘制方式。滑块的末端有一个小圆角。这是在滑块的框架内。所以拇指不会在那个框架内完全移动。

如果您提供了自己的自定义最小和最大滑块图像,您的软糖因子可能等于可调整大小图像上的左右大写插图。拇指图像的大小也可能在软糖因素中起作用。

【讨论】:

很高兴再次拥有你的 ios 智慧,rmaddy!谢谢你。第一段最后一句好像少了一两个字,影响了我的理解。我已经澄清了我的问题。有没有办法从 UISlider 的属性中找到 fudge 因子?

以上是关于如何获取给定值沿 UISlider 的位置?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:编程 UISlider 以定位在点击的位置

如何强制 UISlider 值和拇指位置之间的同步?

如何将 UISlider 从自定义类文件中移动到某个位置

如何在单个@IBAction 中获取多个 UISlider 的值?

如何移除 UISlider 的预填充

UISlider 管理 UIPageViewController 分页