我有4个UISlider,最小值为0,最大值为10。我有一个常数(例如:20)。
我的目标是4个滑块值的总和不超过该常数。
例如:如果我拖动并设置为第一和第二个滑块的最大值(即10),那么现在4个滑块的总和为20。
我不想允许其他2个滑块(第3,第4)增加。如果我减小任何滑块(第一或第二)值,则意味着我可以允许它们(2、3、4)增大滑块值。
帮助我实现这一目标。
答案 0 :(得分:2)
在fd_openedFile = open(filename, O_RDONLY)
char *miniBuffer[1];
int lineCounter = 0;
while( read(fd_openedFile, miniBuffer, 1) >0) {
if (*miniBuffer[0] == '\n')
lineCounter++;
}
中,计算所有滑块的总和。如果总和大于最大值,只需将“ cause”滑块的值(例如,用户当前拖动的那个滑块)重置为允许的最大值。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
void err_sys(const char* cadena, int continueExecuting) {
perror(cadena);
if (continueExecuting == 0)
exit(1);
}
int main()
{
//vars
char filename[200];
int fd_output = 1;
int fd_openedFile = -1;
int fd_newFile = -1;
//Ask for the file and open it
while (fd_openedFile < 0){
write(fd_output, "Write the filename: ", 20);
scanf("%s", filename);
if ((fd_openedFile = open(filename, O_RDONLY)) < 0)
err_sys("Error opening the original file", 1);
}
//Construct the new file's name
char *partOfOldFilename = strtok(filename, ".");
char newFileName[208], finalPart[8];
strcpy(newFileName, partOfOldFilename);
strcpy(finalPart, "OUT.txt");
strcat(newFileName, finalPart);
//Create the new file
if ((fd_newFile = open(newFileName, O_WRONLY | O_CREAT)) < 0)
err_sys("Error opening the new file", 1);
//Count the number of lines
char miniBuffer[1];
int lineCounter = 0;
while( read(fd_openedFile, &miniBuffer[0], 1) >0) {
write(fd_output, "R", 1); //To debug
if (miniBuffer[0] == '\n') {
lineCounter++;
write(fd_output, "1", 1); //To debug
} else {
write(fd_output, "0", 1); //To debug
write(fd_output, miniBuffer, 1); //To debug
}
}
lseek(fd_openedFile,0,SEEK_SET);
write(fd_output, "=========\n", 10); //To debug
//Count the number of chars per line
char* charsPerLine[lineCounter];
lineCounter = 0;
int charCounter = 0;
while( read(fd_openedFile, miniBuffer, 1) >0){
write(fd_output, "C", 1); //To debug
if (miniBuffer[0] == '\n') {
*(charsPerLine[lineCounter]) = charCounter +'0';
lineCounter++;
charCounter = 0;
write(fd_output, "1", 1); //To debug
} else {
write(fd_output, "0", 1); //To debug
write(fd_output, miniBuffer, 1); //To debug
charCounter ++;
}
}
lseek(fd_openedFile,0,SEEK_SET);
write(fd_output, "END", 4); //To debug
//Write a copy of the original file starting each line with the number of chars in it
lineCounter = 0;
int bufSize = 1;
char buffer[bufSize];
//First number write
if (write(fd_newFile,charsPerLine[lineCounter], bufSize)!=bufSize)
err_sys("write_error", 0);
lineCounter++;
while( read(fd_openedFile, buffer, bufSize) >0){
if (write(fd_newFile,buffer, bufSize)!=bufSize)
err_sys("write_error", 0);
if (buffer[0] == '\n') {
if (write(fd_newFile,charsPerLine[lineCounter], bufSize)!=bufSize)
err_sys("write_error", 0);
lineCounter++;
}
}
//Finish program
if (close(fd_openedFile)!=0) err_sys("error closing original file's file descriptor", 0);
if (close(fd_newFile)!=0) err_sys("error closing new file's file descriptor", 0);
return 0;
}
答案 1 :(得分:0)
具有一个集中的方法,所有滑块都可以调用valueChanged
事件。
在该方法中,将所有滑块的值相加。随着总和的变化,请调整所有滑块的最大值,以使增加任何一个滑块都不会超过您的总和。 (每个滑块的新最大值将是其当前值与max_sum_total-current_sum_total之差。
因此,如果将所有滑块设置为5,则您的方法会将所有滑块的最大值调整为5。
如果滑块A为10,滑块B为5,其他滑块为0
Slider A max would be MIN((20 - (A+B+C+D) - A), 10) //5
Slider B max would be MIN((20 - (A+B+C+D) - B), 10) //10
...等等。
答案 2 :(得分:0)
您可以使用以下代码进行粗略的开始。我正在使用单一方法来处理所有4个UISliders。您可以根据需要重构代码
@IBAction func touchDrag(_ sender: UISlider) {
switch sender {
case slider1:
let f1 = (sender.value + slider2.value)
let f2 = (slider3.value + slider4.value)
if f1 + f2 > 20 {
sender.value = 20 - (slider2.value + slider3.value + slider4.value)
}
case slider2:
let f1 = (slider1.value + sender.value)
let f2 = (slider3.value + slider4.value)
if f1 + f2 > 20 {
sender.value = 20 - (slider1.value + slider3.value + slider4.value)
}
case slider3:
let f1 = (slider1.value + slider2.value)
let f2 = (sender.value + slider4.value)
if f1 + f2 > 20 {
sender.value = 20 - (slider1.value + slider2.value + slider4.value)
}
default:
let f1 = (slider1.value + slider2.value)
let f2 = (slider3.value + sender.value)
if f1 + f2 > 20 {
sender.value = 20 - (slider1.value + slider2.value + slider3.value)
}
}
}