如何获取给定值沿 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 的位置?的主要内容,如果未能解决你的问题,请参考以下文章