3个互连滑块

我已经在这个问题上绞尽脑汁两天了,我尝试了不同的东西,但都没有成功。 我正在构build一个应用程序,这是一种quizz。 有三个问题包含问题。 我想用3个滑块来定义他们想要在每个主题上的问题的百分比。

ex : slider one = History slider two = Maths slider three = Grammar 

如果我select了更多历史logging,则滑动历史logging滑块,其他滑块将根据3滑块必须达到的值降低…

任何想法的algorithm? 当一个滑块达到零值时会发生什么?

math从来就不是我的场景。

任何帮助将非常感激。

提前致谢。

麦克风

下面的algorithm应该被审查,当然也是最优化的。 这只是我放在一起的东西,我还没有testing过。

初始化每个滑块的最大值和最小值,并根据需要设置初始值,但要考虑到x + y + z = 1

 [self.slider1 setMinimumValue:0.0]; [self.slider1 setMaximumValue:1.0]; [self.slider1 setValue:0.20]; [self.slider2 setMinimumValue:0.0]; [self.slider2 setMaximumValue:1.0]; [self.slider2 setValue:0.30]; [self.slider3 setMinimumValue:0.0]; [self.slider3 setMaximumValue:1.0]; [self.slider3 setValue:0.50]; 

将三个滑块设置为相同的select器:

 [self.slider1 addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; [self.slider2 addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; [self.slider3 addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; 

select器应该这样做:

 - (void)valueChanged:(UISlider *)slider { UISlider *sliderX = nil; UISlider *sliderY = nil; UISlider *sliderZ = nil; if (slider == self.slider1) { sliderX = self.slider1; sliderY = self.slider2; sliderZ = self.slider3; } else if (slider == self.slider2) { sliderY = self.slider1; sliderX = self.slider2; sliderZ = self.slider3; } else { sliderY = self.slider1; sliderZ = self.slider2; sliderX = self.slider3; } float x = sliderX.value; float y = sliderY.value; float z = sliderZ.value; // x + y + z = 1 // Get the amout x has changed float oldX = 1 - y - z; float difference = x - oldX; float newY = y - difference / 2; float newZ = z - difference / 2; if (newY < 0) { newZ += y + newY; newY = 0; } if (newZ < 0) { newY += z + newZ; newZ = 0; } [sliderY setValue:newY animated:YES]; [sliderZ setValue:newZ animated:YES]; } 

如果这个代码有什么问题,请让我知道,我可以修复它!

虽然Snowangelic的答案是好的,但我觉得把不变价值之间的比例约束如下是更有意义的。

令s1,s2,s3为滑块的当前值,以便s1 + s2 + s3 = 100。 你想解决滑块的新值n1,n2,n3,所以n1 + n2 + n3 = 100。 假设用户将s1更改为n1。 然后,这增加了以下约束:

n2 / n3 = s2 / s3

所以这个问题的解决scheme是n1 + n2 + n3 = 100

n2 =(100-n1)/(s3 / s2 + 1)或0(如果s2 = 0)

n3 =(100-n1)/(s2 / s3 + 1)或0(如果s3 = 0)

开始所有三个滑块33.333 …%

当用户将滑块向上移动10%时:将其他两个滑块向下移动5%。 但是,如果两个滑块之一达到0 =>只移动百分之十的另一个。 所以它提供了这样的东西:

 User moved slider of x (my be positive or negative) for first slider if slider -x/2 > 0 and x/2 < 100 move this slider of -x/2 else move the other slider of -x/2 for second slider if slider -x/2 > 0 and x/2 < 100 move this slider of -x/2 else move the other slider of -x/2 end 

另一种可能性是考虑到可用资源的总和是100,资源被分成n个桶(在你的情况3中)。 当用户移动滑块时,他将相应桶中的资源数量固定。 所以你可以从其他的桶里拿出资源,或者把资源放在其他的桶里。

你有这样的东西:

 state 1 ; modified bucket ; new number of ressources in that bucket modification = new number of ressources in the bucket - number of rescources in the state 1 for (int i=0 ; modification > 0 ; i++){ i=i%nbr of buckets; if(bucket i != modified bucket){ if(number of ressources in bucket i-- > 0 && number of ressources in bucket i-- < 100){ number of ressources in bucket i--; modification --; } } } 

这是假设修改是正面的(修改的桶中的新数字比以前更高)。 这个小algorithm可以处理任何数量的桶(在你的情况下滑块)。