3个相互连接的滑块

我已经在这个问题上绞尽脑汁待了两天,我尝试了不同的东西,但没有一个能奏效。我正在构建一个应用程序,这是一种quizz。有三个主题包含问题。我想使用3个滑块来定义他们想要在每个主题上的问题百分比。
ex : slider one   = History
     slider two   = Maths
     slider three = Grammar
如果我选择了更多历史记录,我会向上滑动历史记录滑块,其他滑块应根据3个滑块的值达到100%而减少... 算法的任何想法?当一个滑块达到零值时会发生什么? 数学从来就不是我的场景。 任何帮助将非常感谢。 提前致谢。 麦克风     
已邀请:
应该审查以下算法,当然还要优化。这只是我放在一起的东西,我没有测试过。 用最大值和最小值初始化每个滑块并根据需要设置初始值,但要尊重
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];
将三个滑块设置为相同的选择器:
[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];
选择器应该做这样的事情:
- (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 所以问题的解决方案是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 --;
    }
  }
}
这是假设修改是肯定的(修改后的桶中的新数字比以前更高)。这个小算法适用于任意数量的桶(在您的情况下为滑块)。     

要回复问题请先登录注册