3

我有一个沿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;

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

  1. 为什么我需要这个~3.5 的软糖因子?它来自哪里,我怎么知道它是否对所有滑块都相同?
  2. 为什么我不能从中获得价值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提供一个可能的答案。也许拇指的宽度没有设置,因为滑块还没有被绘制......这是对的吗?

4

1 回答 1

0

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

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

于 2013-05-05T04:38:18.857 回答