gpt4 book ai didi

iphone - 如何让UISlider以指数方式输出漂亮的四舍五入数字?

转载 作者:行者123 更新时间:2023-12-03 18:39:07 27 4
gpt4 key购买 nike

我正在实现一个 UISlider,用户可以操纵它来设置距离。我从未使用过CocoaTouch UISlider,但使用过其他框架 slider ,通常有一个变量用于设置“step”和其他“helper”属性。

UISlider 的文档仅涉及最大值和最小值,并且输出始终是 6 位十进制 float ,与“ slider 旋钮”的位置呈线性关系。我想我将不得不一步步实现所需的功能。

对于用户来说,最小/最大值范围从 10 m 到 999 Km,我试图以指数方式实现这一点,这对用户来说会感觉很自然。 IE。用户体验到对数值(无论大小)的控制感。此外,“输出”具有合理的值。诸如 10m 200m 2.5km 150 km 等值,而不是 1.2342356 m 或 108.93837756 km。

我希望前 200m 的步长增加 10m,然后可能增加 50m 直到 500m,然后当通过 1000 m 值时,它开始处理公里,所以步长 = 1公里直到 50 公里,然后可能是 25 公里步等。

无论我采取什么方式,我最终都会进行大量舍入和大量计算大量的 if 语句和 NSString/Number 转换,每次用户移动 slider 一点点。

我希望有人能给我一些灵感/数学帮助或让我意识到解决这个问题的更精简的方法。

我的最后一个想法是用 100 个字符串值填充和数组,然后让 slider int 值对应于一个字符串,这不是很灵活,但可行。

提前感谢您提供的任何帮助:)

最佳答案

快速扩展解决方案涉及三种特殊方法:

- (CGFloat)scaleValue:(CGFloat)value {
return pow(value, 10);
}

- (CGFloat)unscaleValue:(CGFloat)value {
return pow(value, 1.0 / 10.0);
}

- (CGFloat)roundValue:(CGFloat)value {
if(value <= 200) return floor(value / 10) * 10;
if(value <= 500) return floor(value / 50) * 50;
if(value <= 1000) return floor(value / 100) * 100;
if(value <= 50000) return floor(value / 1000) * 1000;
return floor(value / 25000) * 25000;
}

对 slider 更改的 react 类似于:

- (void)sliderChange:(id)sender {
CGFloat value = mySlider.value;
value = [self scaleValue:value];
value = [self roundValue:value];
valueLabel.text = [NSString stringWithFormat:@"%f", value];
}

您可以使用以下代码进行初始化:

mySlider.maximumValue = [self unscaleValue:999000];
mySlider.minimumValue = [self unscaleValue:10];

我让上述所有工作都没有任何问题,但它可以使用一些防弹措施。 scaleValue:unscaleValue: 方法应该检查不支持的值,我确信 sliderChange: 方法可能会更有效。

就速度而言,我确信这比从数组中提取对象要快。实际的 slider 行为可能感觉有点奇怪,并且对 slider 可用的值没有太多控制,因此它可能无法完全满足您的要求。使用真正的高功率似乎使它更有用。

关于iphone - 如何让UISlider以指数方式输出漂亮的四舍五入数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com