我有一个沿UISlider
--values 的任意值数组,我想使用类似这种方法的方法将其用作刻度线/停止,但在滑块框架本身中绘制。如何可靠地找到或计算这些值在滑块框架内沿滑块的像素/点位置?
只是要强调:与如何获取 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;
编辑
我很欣赏到目前为止得到的答复,尽管从他们看来,我的问题似乎不够准确。
正如我在评论中提到的那样,我的想法是使这段代码可重用(并使其可供社区使用),因此开发人员只需将代码放在适当的位置,而不必四处寻找适合他的软糖因素自己的滑块。所以让我澄清问题#1:
1'。有什么方法可以获得 3.5 或给定滑块配置的任何数字吗?例如,也许是滑块的一个参数(类似于thumbWidth
),所以刻度线会自动正确对齐?
类UISlider
参考非常稀疏。阅读它,我永远不会想到slider.currentThumbImage.size.width;
非nil
。我认为 3.5-ish fudge 可能同样隐藏在UISlider
的晦涩属性中。
实际上,重新阅读我刚刚写的内容可以为问题 #2提供一个可能的答案。也许拇指的宽度没有设置,因为滑块还没有被绘制......这是对的吗?