处理多个UISlider

时间:2019-01-17 13:59:50

标签: ios swift uitableview uislider

我有4个UISlider,最小值为0,最大值为10。我有一个常数(例如:20)。

我的目标是4个滑块值的总和不超过该常数。

例如:如果我拖动并设置为第一和第二个滑块的最大值(即10),那么现在4个滑块的总和为20。

我不想允许其他2个滑块(第3,第4)增加。如果我减小任何滑块(第一或第二)值,则意味着我可以允许它们(2、3、4)增大滑块值。

帮助我实现这一目标。

You can see this screen shot

You can see this screen shot

3 个答案:

答案 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。您可以根据需要重构代码

enter image description here

@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)
            }
        }
    }