我有一个UISlider
的任意值数组 - 我想用它作为刻度线/停止使用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;
我希望我的代码可以重复使用不同的值范围,滑块大小,自定义大拇指等,所以我有两个问题/问题:
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
Class Reference相当稀疏。阅读它,我永远不会期望slider.currentThumbImage.size.width;
是非nil
。我认为3.5-ish软糖可能同样隐藏在UISlider
晦涩难懂的属性中。
实际上,重新阅读我刚才写的内容可能会为问题#2 提供一个可能的答案。也许没有设置拇指的宽度,因为尚未绘制滑块......这可能是正确的吗?
答案 0 :(得分:0)
“软糖因子”很可能是由于绘制滑块的方式。滑块有一个圆形末端。这是在滑块的框架内。所以拇指在那个框架内没有完全移动。
如果您提供了自己的自定义最小和最大滑块图像,则您的软糖因子可能会等于可调整大小的图像上的左右帽子插图。拇指图像的大小也可能在软糖因子中起作用。